Linux/使用 awk 对日志内容做统计

Linux/使用 awk 对日志内容做统计

awk 是一个行编辑器,说明如下: - 一次读取一行文本,按照输入分隔符进行切片,,默认分隔符为空格,切成多个组成部分(多个切片) - 将切片直接保存在内建的变量中,$1、$2...($0 表示一整行) - 支持对单个切片的判断,支持循环判断
下面是使用 netstat -ntlp 查看网络状态

如果只想要输出第一列和第四列的内容,可以使用netstat -ntlp | awk '{print $1, $4}',awk 命令就会去遍历netstat -ntlp输出结果的每行,去输出第一列和第四列。

如果想根据条件输出对应的行,比如只输出 proto 为 tcp,且 Recv-Q 为 0 的行,可以使用netstat -ntlp | awk '$1=="tcp" && $2=="0" {print $0}'


在上面的输出结果中,没有输出表头。在 awk 中定义有内建变量,在 awk 中默认使用换行符将行分开,其中 NR 代表行数,所以想要打印表头,可以使用 netstat -ntlp | awk '($1=="tcp" && $2=="0") || NR=1 {print $0}'


在 awk 中默认使用空格将列分隔,可以使用-F参数修改列分隔符,如果一个文件使用,作为列分隔符,如下图:


想输出上图的第二列,可以使用awk -F "," '{print $2}' test.txt


awk 还可以对文件逐行进行统计操作,并列出统计结果。例如统计上面 test.txt 文件中每一个字母出现的次数,可以使用awk -F "," '{arr[$2]++}END{for(i in arr) print i "\t" arr[i]}' test.txt。其中 arr 表示我们定义的数组名字,arr[$2]代表下标是每行的第二个变量,对第二个变量相同的下标进行累加操作。END{} 中的内容表示每行扫描结束后的后续操作,只会执行一次,遍历输出数组中的内容。


评论