1,指定多分隔符
实例: 提取文件名和大小,展示为"test.sql.gz 100M"
# du -sh /bkup/dayback/test.sql.gz
100M /bkup/dayback/test.sql.gz
命令如下:
# du -sh /bkup/dayback/test.sql.gz | awk -F '[/ ]+' '{print $NF, " ", $1}'
test.sql.gz 100M
命令解析:
- -F 指定分隔符
- -F[/ ]+ 表示指定多个分隔符,这里指定/和空格(也可以是其他),+为正则表达式,表示+前面的字符(/或者空格)重复1次或者一次以上
- $NF awk内置变量,表示最后一个字段的内容
- NF awk内置变量,表示浏览记录字段的个数
更多:
# echo "1:::2:3 4 5 6" | awk -F[: ]+ '{print $4}'
4
2,数组
实例:统计tcp连接状态
# netstat -an |grep ^tcp | head -5
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp 0 0 192.168.200.41:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
# netstat -an | awk '/^tcp/{++S[$NF]} END{for(a in S) print a, S[a]}'
LAST_ACK 54
LISTEN 24
CLOSE_WAIT 70
ESTABLISHED 86
FIN_WAIT2 32
TIME_WAIT 984
命令解析:
awk中的数组本质上属于关联数组,也就说它的下标可以为字符串,在上述例子中,首先创建了一个数组S并且将该命令输出的最后一个字段作为下标(LAST_ACK,LISTEN,CLOSE_WAIT...),当执行到第一行时,我们引用的是S['LISTEN'],很明显这个元素是不存在的,awk在元素不存在时,会自动创建该元素,并且将该元素的值设为0,因此经过计算后S['LISTEN']值会变为1,由于END模式中的语句会在最后执行,这里姑且先不考虑它,继续运行第二行,依旧是S['LISTEN'],此时经过计算,它的值会变为2,以此类推,指导执行完最后一行结束,进入END模式的运行,通过一个for循环,打印出数组的下标和它的值,即为我们最终想要的结果。PS:awk在字符串,空字符串参与运算时,也会将其当做0来处理