格式: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