awk 是一种模式扫描和处理语言,在对数据进行分析处理时,是十分强大的工具。
|
|
awk 的工作过程是这样的:按行读取输入 (标准输入或文件),对于符合模式 pattern 的行,执行 action。当 pattern 省略时表示匹配任何字符串;当 action 省略时表示执行'{print}';它们不可以同时省略。
每一行输入,对 awk 来说都是一条记录 (record),awk 使用 $0 来引用当前记录:
|
|
例子中将命令 head -1 /etc/passwd 作为 awk 的输入,awk 省略了 pattern,action 为 print $0,意为打印当前记录。
对于每条记录,awk 使用分隔符将其分割成列,第一列用 $1 表示,第二列用 $2 表示… 最后一列用 $NF 表示
选项 -F 表示指定分隔符
如输出文件 /etc/passwd 第一行第一列 (用户名) 和最后一列(登录 shell):
|
|
当没有指定分隔符时,使用一到多个 blank(空白字符,由空格键或 TAB 键产生) 作为分隔符。输出的分隔符默认为空格。
如输出命令 ls -l * 的结果中,文件大小和文件名:
|
|
还可以对任意列进行过滤:
|
|
其中 $5>20 表示第五列的值大于 20;&& 表示逻辑与;$NF ~ /txt$/ 中,~ 表示匹配,符号 // 内部是正则表达式。这里省略了 action,整条 awk 语句表示打印文件大小大于 20 字节并且文件名以 txt 结尾的行。
awk 用 NR 表示行号
|
|
例子中 || 表示逻辑或,语句表示:输出文件 /etc/passwd 中以 root 开头的行或者第二行。
在一些情况下,使用 awk 过滤甚至比使用 grep 更灵活
如获得 ifconfig 的输出中网卡名及其对应的 mtu 值
|
|
以上所说的 NR、NF 等都是 awk 的内建变量,下面列出部分常用内置变量
|
|
awk 中还可以使用自定义变量,如将网卡名赋值给变量 a,然后输出网卡名及其对应的 RX bytes 的值 (注意不同模式匹配及其 action 的写法):
|
|
awk 中有两个特殊的 pattern:BEGIN 和 END;它们不会对输入文本进行匹配,BEGIN 对应的 action 部分组合成一个代码块,在任何输入开始之前执行;END 对应的 action 部分组合成一个代码块,在所有输入处理完成之后执行。
|
|
awk 还支持数组,数组的索引都被视为字符串 (即关联数组),可以使用 for 循环遍历数组元素
如输出文件 /etc/passwd 中各种登录 shell 及其总数量
|
|
当然也有 if 分支语句
|
|
pattern 之间可以用逗号分隔,表示从匹配第一个模式开始直到匹配第二个模式
|
|
还支持三目操作符 pattern1 ? pattern2 : pattern3,表示判断 pattern1 是否匹配,true 则匹配 pattern2,false 则匹配 pattern3,pattern 也可以是类似 C 语言的表达式。
如判断文件 /etc/passwd 中 UID 大于 500 的登录 shell 是否为 /bin/bash,是则输出整行,否则输出 UID 为 0 的行:
|
|
选项 -f file 表示从 file 中读取 awk 指令
|
|
选项 -F 指定列分隔符
|
|
选项 -v var=val 设定变量
|
|
print 等函数还支持使用重定向符 > 和 >> 将输出保存至文件
|
|
内建函数
length() 获得字符串长度
|
|
split() 将字符串按分隔符分隔,并保存至数组
|
|
getline 从输入 (可以是管道、另一个文件或当前文件的下一行) 中获得记录,赋值给变量或重置某些环境变量
|
|
next 作用和 getline 类似,也是读取下一行并覆盖 $0,区别是 next 执行后,其后的命令不再执行,而是读取下一行从头再执行。
|
|
sub(regex,substr,string) 替换字符串 string(省略时为 $0) 中首个出现匹配正则 regex 的子串 substr
|
|
substr(str,n,m) 切割字符串 str,从第 n 个字符开始,切割 m 个。如果 m 省略,则到结尾
|
|
tolower(str) 和 toupper(str) 表示大小写转换
|
|
system(cmd) 执行 shell 命令 cmd,返回执行结果,执行成功为 0,失败为非 0
|
|
match(str,regex) 返回字符串 str 中匹配正则 regex 的位置
|
|
awk 作为一个编程语言可以处理各种各样的问题,甚至于编写应用软件,但它更常用的地方是命令行下的文本分析,生成报表等,这些场景下 awk 工作的很好。工作中如经常有文本分析的需求,那么掌握这个命令的用法将为你节省大量的时间。