awk 以输入文件的一行为处理单位,进行匹配和分析
awk
1 | awk '{pattern + action}' {filename} |
pattern使用/
包围,如/root/
匹配含有root的行,可以使用正则
action使用{}
包围。
如awk -F: '/^root/ {print $1 ", " $ 7}' /etc/passwd
,匹配root
开头的行,输出第一个域和第七个域。
栗子1
命令awk -F ':' 'BEGIN {print "name, shell"} {print $1", "$7} END {print "blue, /bin/nosh"}' /etc/passwd
每个action
使用{}
包围,一个{}
内可以有多个action,需要使用;
分割,如'{count++; print $0} END {print "count is ", count}'
,
结果:
1 | awk -F ':' 'BEGIN {print "name, shell"} {print $1", "$7} END {print "blue, /bin/nosh"}' /etc/passwd |
栗子2
命令$ awk -F: '/root/' /etc/passwd
匹配root
的域,没有指定action,默认print $0
打印全部
匹配可以使用正则表达式
结果:
1 | awk -F: '/root/' /etc/passwd |
栗子3
命令$ awk -F: '/root/ {print $1 ", " $ 7}' /etc/passwd
匹配是按整行的
结果:
1 | awk -F: '/root/ {print $1 ", " $ 7}' /etc/passwd |
栗子4
FILENAME
, NR
, NF
, $0
的含义
1 | awk -F: '{printf("filename:%10s, linenumber:%s, columns:%s, linecontent:%s\n", FILENAME, NR, NF, $0)}' /etc/passwd |
栗子5
统计文件大小,含文件夹(linux 下文件夹大小为 4096)
1 | ll | awk 'BEGIN{size=0} {size=size+$5} END{print "size=" size/1024/1024 "M"}' |
统计文件大小,不含文件夹
1 | ll | awk 'BEGIN{size=0} {if ($5 != 4096) {size+=$5}} END{print "size = " size/1024/1024 "M"}' |
1 | ll |
栗子6
输出双引号与单引号
1 | echo | awk '{print "\""}' # 输出双引号 |