AWK是一个很好的文本处理工具。下面把自己的学习内容和大家分享下。
①首先是变量内容:
FS:读取文本时的字段分隔符。
RS:输入文本时的记录换行符。
OFS:输出文本时的字段分隔符。
ORS:输出文本时的记录换行符。
NF:字段数量。(即一条记录中字段的个数)。
NR:单个文件中记录的个数,如果AWK后面参数跟了多个文件。那么这个数量是两个文件加起来的记录数量的总和。
FNR:文件中记录的数量。如果是单个文件,那么NR=FNR,如果输多个文件的话,FNR的数量当读到下一个文件的时候会重新计算。但是NR会一直累加。
②BEGIN 和END的介绍
BEGIN一般在用在读取第一行文本之前,相当于进行初始化或者是声明格式或者是变量。
例子:
awk ‘BEGIN{TEST=”hello world”; print test}’
awk –F:‘BEGIN{“USERNAME,BASH”} {pintf“%-20s%-20s\n”,$1,$7}’ /etc/passwd
END一般用在打印输出第一行文本之前。表示的是输入已经全部的读取完毕。
例子:
netstat –tan|awk ‘/^tcp/{state[$NF]++}END{for (s in state){print s,state[s]}}’
统计的是处在每个tcp连接状态的数量。
③在AWK中同样适用的是操作符,比如算数运算符,布尔,以及模式匹配。
X~Y 表示的是如果X能够匹配上Y的字符串。
X!~Y表示的是X不能够匹配上Y的字符串。
如果是模式匹配的话 我们/pattern/来表示。
④几个例子,在例子中统一的使用的是/etc/passwd这个文件为处理文件。
列出文件中默认的shell是bash的用户名和shell
awk –F:‘$7==”/bin/bash”{print $1,$7}’ /etc/passwd
列出每行中数量大于4的字段。
awk –F: ’{for(i=1;i<=$NF;i++) {if (length($i)>=4) print $i}}’ /etc/passwd
列出各种tcp连接状态的数量
netstat –tan|awk‘/^tcp/{state[$NF]++}END{for (s in state) print s,state[s]}’