awk
是一种模式扫描和处理语言,在对数据进行分析处理时,是十分强大的工具。
|
|
awk
的工作过程是这样的:按行读取输入 (标准输入或文件),对于符合模式 pattern
的行,执行 actio
n。当 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 工作的很好。工作中如经常有文本分析的需求,那么掌握这个命令的用法将为你节省大量的时间。