介 绍:awk主要处理每一行的字段内的数据,默认分隔符:任意数量的空格或者任意数量的tab
用 法:
awk '模式 操作' file ...
1、awk '/正则表达式/ {print ...}' file ... 正则表达式相当于egrep中的正则
注意:模式或者操作都是可选的,若省略操作(比如省略'{print $1}'),则正则模式匹配的整行
下面两种方式输出结果一样
$ cat file_a
pa:11:a
sa:32:c
app:5:b
stort:1:d
pear:4:aa
hello:3:f
$ egrep '^a' file_a
app:5:b
$ awk '/^a/ {print $0}' file_a
app:5:b
2、awk '条件模式 操作' file ...
awk -F: '$2==""' /etc/passwd 打印以冒号分隔符的第二个字段可空的行
等价于模式: $2 ~ /^$/ 第二个字段匹配为空
$2 !~ /./ ------------>这里的!~表示不匹配
length($2)==0
!($2 ~ /./)
其他的模式:
NF == 10 10列
NF % 2 == 0 列数为偶数
length($0) > 20
例如:
awk -F: 'length($0) > 30 {print substr($0, 1, 30)}' file 若行过长,则取这一行的前30个字符
3、awk的特殊用法,BEGIN和END两者可以连用,也可以单独使用
BEGIN在读入第一行之前就被执行,可以使用BEGIN模式初始化变量,打印标题头或通过指定变量FS设置字段分隔符。
END动作在处理完最后一行后执行。
例如:
awk 'BEGIN {FS=":"} $2 != "vobile" {print $0} END {print NR}' file
注意: awk 'BEGIN {FS=":"} $2 != "vobile" END {print NR}' file 这样是不对的 ,END前和后必须要有操作
4、awk中的算术变量和运算
awk中的真正的实力是对输入数据进行计算的能力,可以很容易的实现计数、累计求和、求平均数。最常用的是求各数字列的总和。
例如:求第二列之和
$ cat file_a
pa:11:a
sa:32:c
app:5:b
stort:1:d
pear:4:aa
hello:3:f
$ awk 'BEGIN {FS=":"} {s = s + $2} END {print s}' file_a
56