使用 awk 对日志内容做统计

张贤 2020年03月09日 89次浏览

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{}` 中的内容表示每行扫描结束后的后续操作,只会执行一次,遍历输出数组中的内容。