格式:awk -F '[分隔符]' '{pattern + action}' filename[s]
工作方式:awk对指定filename[s]逐行扫描,从第一行到最后一行,读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,每个域部分再进行各种分析处理,寻找匹配的特定模式的行。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。
说明:awk是一个强大的文本分析工具,用于在linux/unix下对文本和数据进行处,awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本;模式pattern可以是正则表达式、关系表达式、模式匹配表达式;操作action由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,
BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
END:让用户在最后一条输入记录被读取之后发生的动作
print函数的参数可以是变量、数值或者字符串。自定义的内容如字符串、分隔符必须用双引号引用,逗号不用双引号输出为空格
内建变量FS保存输入域分隔符的值,默认是空格或tab。可以通过-F命令行选项修改FS的值。可以同时使用多个域分隔符,此时需把分隔符放到方括号中,如$awk -F'[:/t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符
[root@justin ~]# touch /home/last [root@justin ~]# last -n 5 > !$ last -n 5 > /home/last [root@justin ~]# cat /home/last root pts/010.15.72.73 Thu Nov 21 16:45 still logged in reboot system boot 2.6.32-279.el6.i Thu Nov 21 16:45 - 15:46 (23:01) root pts/010.15.72.73 Mon Nov 18 11:02 - down (1+21:13) reboot system boot 2.6.32-279.el6.i Mon Nov 18 10:23 - 08:16 (1+21:53) root pts/010.15.72.73 Fri Nov 15 15:27 - down (02:09) wtmp begins Wed Nov 13 17:30:52 2013 [root@justin ~]# awk '{print $3}' /home/last 10.15.72.73 boot 10.15.72.73 boot 10.15.72.73 Wed [root@justin ~]# tail -5 /etc/passwd|awk -F ':' '{print $1}' nfsnobody abrt sshd tcpdump justin [root@justin ~]# tail -5 /etc/passwd|awk -F':' '{print $1"\t"$7}' nfsnobody /sbin/nologin abrt /sbin/nologin sshd /sbin/nologin tcpdump /sbin/nologin justin /bin/bash [root@justin ~]#
显示/etc/passwd最后5个账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"justin1,/bin/nosh"。
[root@justin ~]# tail -5 /etc/passwd|awk -F : 'BEGIN {print "name,shell"} {print $1","$7} END {print "justin1,/bin/nosh"}' name,shell nfsnobody,/sbin/nologin abrt,/sbin/nologin sshd,/sbin/nologin tcpdump,/sbin/nologin justin,/bin/bash justin1,/bin/nosh [root@justin ~]# tail -5 /etc/passwd|awk -F : 'BEGIN {print "name,shell"} {print $1 , $7} END {print "justin1,/bin/nosh"}' name,shell nfsnobody /sbin/nologin abrt /sbin/nologin sshd /sbin/nologin tcpdump /sbin/nologin justin /bin/bash justin1,/bin/nosh
环境变量:
NF:当前记录已经浏览域的个数,awk把每一个以换行符结束的行称为一个记录,默认的输入和输出的记录分隔符都是回车,保存在内建变量ORS和RS中。
NR:已读的记录数,每处理完一条记录,NR的值就增加1
$n:当前行的第n个域,域间由分隔符隔开,$1表示当前行第一个域,$2表示第二个域,$0表示整行记录;默认情况下各域以空格或tab分隔开
FILENAME:awk浏览的文件名 ,注意大小写
FS:设置输入域分隔符,等价于命令行 -F选项
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
[root@justin ~]# awk -F: '{print "filename : " FILENAME,";""linenumber : " NR,";""Total number of columnsis :" NF,";""linename : " $0}' /etc/passwd ...... filename : /etc/passwd;linenumber : 32 ;Total number of columnsis :7 ;linename : abrt:x:173:173::/etc/abrt:/sbin/nologin filename : /etc/passwd;linenumber : 33 ;Total number of columnsis :7 ;linename : sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin filename : /etc/passwd;linenumber : 34 ;Total number of columnsis :7 ;linename : tcpdump:x:72:72::/:/sbin/nologin filename : /etc/passwd;linenumber : 35 ;Total number of columnsis :7 ;linename : justin:x:500:500:justin:/home/justin:/bin/bash
匹配操作符:
[root@justin ~]# awk "/root/" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@justin ~]# awk "/^root/" /etc/passwd root:x:0:0:root:/root:/bin/bash [root@justin ~]# awk -F : '/root/ {print $1}' /etc/passwd root operator [root@justin ~]#
范围模版:
范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾
[root@justin ~]# touch /home/passwd [root@justin ~]# tail -8 /etc/passwd > /home/passwd [root@justin ~]# cat !$ cat /home/passwd pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin justin:x:500:500:justin:/home/justin:/bin/bash [root@justin ~]# awk "/gdm/,/sshd/" /home/passwd gdm:x:42:42::/var/lib/gdm:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin [root@justin ~]#
运算符:
= += -= *= /= %= ^= **= 赋值
|| 逻辑或
&& 逻辑与
~ ~! 匹配正则表达式和不匹配正则表达式;awk '$1 ~ /101/ {print $1}' file 显示文件中第一个域匹配101的行(记录)
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / & 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用 ,$NF表示最后一个域
[root@justin ~]# awk -F: '/root/ && /bash/ {print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash [root@justin ~]# awk -F: '/root/ {print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@justin ~]# awk -F: '$1=="tcpdump"' /etc/passwd tcpdump:x:72:72::/:/sbin/nologin [root@justin ~]# awk -F: '$3>499 || $4<1' /etc/passwd root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin justin:x:500:500:justin:/home/justin:/bin/bash [root@justin ~]#
待完善......