基础详解
官方文档 https://www.runoob.com/linux/linux-comm-awk.html
awk工具,主要将一行分成“字段”来处理,字段指的是以空格分开的,它可能不只一个字符。
awk '条件类型1{动作1} 条件类型2{动作2}...‘ filename
awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或[tab]键
例如现在有以下文本b
使用
awk '{ print $1 "\t" $3}' b
可以看到它把每一行的第一个和第三个字段都打印了,无论它的长度是多少
变量$0代表一整行数据的意思
如果我们把上面的$1换成$0会发生什么呢
awk '{ print $0 "\t" $3}' b
可以看到首先是把b文本全部打印了一遍 然后再打印了第三列
awk是以行尾一次处理的单位,而以字段尾最小的处理单位
变量NF 代表每一行($0)拥有的字段总数
变量NR 代表目前awk所处理的是“第几行”数据
变量FS 代表目前的分割字符,默认是空格键
last -n 4 | awk '{print $1 "\t lines: " NR "\t columes: " NF}' 在awk内的NR,NF等变量要大写,且不需要 $ 啦。
例题
1.1.统计TCP的连接数量,其中LISTEN多少个,ESTABLISHED多少个。
[root@heiniao ~]# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.251:12000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1013 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:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.251:22 192.168.1.17:3321 ESTABLISHED
tcp 0 248 192.168.1.251:22 192.168.1.17:62916 ESTABLISHED
tcp 0 0 192.168.1.251:22 192.168.1.17:62903 TIME_WAIT
tcp 0 0 :::22 :::* LISTEN
指令
netstat -ant | awk '/^tcp/{STATE[$NF]++}END{for(S in STATE) {print S,STATE[S]}}'
这里netstat -ant是查看下当前的网络连接状态 | 的意思是用前一段指令的输出作为输入到下一段指令 ^tcp表示以tcp为开头的行才统计,//为正则匹配
解释:在这句awk语句里面,STATE就是我们建立的数组的名称,它的下标非常独特,它可以是LISTEN,如STATE[$NF]====>STATE[LISTEN],而STATE[$NF]++======>1,每次读一行+1最后就统计出来了LISTEN有多少个,而最后for(S in STATE)中的S就代表的是LISTEN和ESTABLISHED,而STATE[S]代表的就是一共多少次,所以最后显示出来的结果如下: