一、简介
awk命令的主要功能是用于对文本或数据进行处理。使用该命令可以让用户根据自己自定义的属性或正则表达式,对文本或数据进行高效处理。
其次awk可以逐行读取文件或数据,并对数据提供类似于编程的功能,例如:字符串的处理和格式化输出、变量定义与计算和条件判断。它的这些特性让awk在处理结构化内容或数据时非常高效。
awk命令是由三位创始人Alfred Aho、Peter Weinberger、Brian Kernighan的姓氏缩写而来。
二、语法
语法:awk 参数 文件名
参数说明:
-f progfile:从文件读取awk程序代码
-F fs:设置字段分隔符(默认是空格)
-v var=val:在执行前设置变量值
-b:将所有字符视为单字节处理
-c:使用传统awk模式(禁用gawk扩展)
-C:显示版权信息
-d[file]:将全局变量输出到文件
-e:'程序文本' 指定awk程序代码
-E:file 从文件执行awk程序(更安全的方式)
-g:生成国际化模板文件(.pot)
-h:显示帮助信息
-L:[fatal] 检查代码的可疑问题
-n:识别八进制和十六进制数据
-N:使用本地化数字格式
-O:启用程序优化
-p[file]:生成性能分析报告
-P:启用严格POSIX模式
-r:启用正则表达式区间匹配
-S:沙盒模式(限制危险操作)
-t:检查旧版本兼容性
-V:显示版本信息
内置变量:
变量名称 | 变量描述 |
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出字段分隔符,默认值与输入字段分隔符一致。 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
运算符:
运算符 | 描述 |
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ 和 !~ | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
三、 实战
1、打印整行
[root@Milvus ~]# awk '{print}'
/etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin============省略部分内容输出============
2、获取文件中第1,2列内容(默认以空格分隔)
[]auth --enableshadow
3、以“:”分隔,只获取第1列内容
[root ~]# awk -F : '{print $1}' /etc/passwdrootbindaemon============省略部分内容输出============
4、以“:”分隔,获取第3列大于等于1000(UID)的内容
[root@Milvus ~]# awk -F : '$3>=1000' /etc/passwdnfsnobody:x:65534:65534:Anonymous NFS
User:/var/lib/nfs:/sbin/nologiniwen:x:1000:1000:iwen:/home/iwen:/bin/bashtom:x:1001:1002::/home/tom:/bin/bash
5、以“:”分隔,获取第3列大于1000且第2列等于'tom'的行
[root ~]# awk -F : '$3>1000 && $2="tom" '
/etc/passwdnfsnobody tom 65534 65534 Anonymous NFS User
/var/lib/nfs /sbin/nologintom tom 1001 1002
/home/tom /bin/bash
6、只获取指定关键词(tom)的内容
[root@Milvus ~]# awk '/tom/{print}'
/etc/passwdtom:x:1001:1002::/home/tom:/bin/bash
7、以“:”分隔,获取文件中最后一列内容
[root ~]# awk -F : '{print $NF}' /etc/passwd/bin/bash/sbin/nologin/bin/sync/sbin/shutdown/sbin/halt============省略部分内容输出============