格式:awk '{ pattern + action }' {filenames}

常用参数:

-F 指定分割域符 默认是以空格为分隔符

BEGIN 打印开头

END   打印信息尾

内置变量

ARGC  命令行参数个数

ARGV  命令行参数排列

ENVIRON 支持队列中系统环境变量的使用

FILENAME awk浏览的文件名

FNR      浏览文件的记录数

FS       设置输入域分隔符,等价于 -F选项

NF       浏览记录的域的个数

NR        已读的记录数

OFS       输出域分隔符

ORS       输出记录分隔符

RS        控制记录分隔符

例子:

-F的使用

[root@localhost ~]# cat /etc/passwd |awk -F: '{ print $1"\t"$7}'|head -5

root /bin/bash

bin /sbin/nologin

daemon /sbin/nologin

adm /sbin/nologin

lp /sbin/nologin

BEGIN和END的使用

[root@localhost ~]# cat /etc/passwd |awk -F: 'BEGIN { print "user    shell"}{ print $1"\t"$7} END { print "test      /bin/bash" }'

user    shell

root /bin/bash

bin /sbin/nologin

daemon /sbin/nologin

adm /sbin/nologin

....

test      /bin/bash

匹配查找

[root@localhost ~]# cat /etc/passwd |awk -F: '{ if($1~/root/) print $1"\t"$7 }'

root /bin/bash

精确匹配

[root@localhost ~]# cat /etc/passwd |awk -F: '$1 == "root" { print $0 }'

root:x:0:0:root:/root:/bin/bash

不匹配

[root@localhost ~]#cat /etc/passwd |awk -F: '{ if($1!~/root/) print $1"\t"$7 }'

精确不匹配

[root@localhost ~]# cat /etc/passwd |awk -F: '$1 != "root" { print $0 }'

小于

awk '{if ($6 < $7) print $0 "$6 小于$7"}'

大于

awk '{if ($6 > $7) print $0 "$6 大于$7"}'

任意字符

其记录第一域的第四个字符是a,使用句点.。表达式/^...a/意为行首前三个字符任意,第四个是a,尖角符号代表行首

awk '$1 ~/^...a/'

或关系匹配

awk '$0~/(abc|123)/' 

and or使用

&& 意味着两边匹配均为真

|| 意味着两边匹配,有一真,则为真

awk '{if ($1 == "abc" && $4 == "123") print $0}'

awk '{if ($1 == "abc" || $4 == "123") print $0}'

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

FILENAME,NF,NR使用 等价于cat /etc/passwd|wc -l

[root@localhost ~]#awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

filename:/etc/passwd,linenumber:37,columns:7,linecontent:mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

统计某个文件夹下占用的字节数

ll|awk 'BEGIN {size=0;}{ size=size+$5; }END{ print "total size is",size/1024/1024,"M"}'

total size is 201.351 M

统计和

awk '{ sum += $2 }END{ print sum }' aa