awk技巧总结

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来处理

猜你喜欢

转载自blog.51cto.com/hld1992/2362025