awk Linux自带的强大文本分析工具 ,比较倾向于一行当中分成数个字段来处理。因此, awk 相当的适合处理小型数据的数据处理
awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动作。 awk 可以处理后续接的文件,也可以读取来自前个指令的 standard output 。 但如前面说的, awk 主要是处理每一行的字段内的数据, 而默认的 字段的分隔符为 “空格键” 或 “[tab]
- 语法
awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename awk 'BEGIN{} {} END{}' *// BEGIN{} 预处理指令 {} 每行执行的指令 END{} 最后执行的指令* awk -F : '{print $1}' *// 使用: 作为分隔符 $1 代表第一列 $2 代表第二列 以此类推... print 用来打印输出* awk '{printf "%10s %5s %10s \n", $1, $2, $3}' * // printf 格式化输出,在格式设定当中,务必加上 \n ,才能分行*
可选参数
-F 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F: -v var=value 赋值一个用户定义变量 -f scripfile or --file scriptfile 从脚本文件中读取awk命令 更多参数请参考 man awk
内建变量
**NF** 每一行 ($0) 拥有的字段总数 **NR** 目前 awk 所处理的是『第几行』数据 **FS** 目前的分隔字符,默认是空格键
- 逻辑运算符
运算单元 | 代表意义 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
== | 等于 |
!= | 不等于 |
示例
- 查看某个时间段内的Nginx日志 (查看16:10到16:20的请求记录)
$ cat access.log | egrep ‘10/Jun/2020:16’ | awk -F: ‘$3>10 && $3<20’
- 统计字符串出现次数
$ awk ‘{a[$1]++}END{for ( i in a){ print i,a[i]}}’ ip.txt
- 统计Nginx 日志Access.log文件中某一时间段请求最多前十个ip
$ cat access.log | egrep “10/Jun/2020:16:11” | awk ‘{a[$1]++}END{for ( i in a ) print i,a[i]}’ | sort -nrk2 | head -n 10
- 对输出结果进行格式化
$ cat /etc/passwd | awk -F: ‘{printf( “%20s \t %10s \t %15s \n”, $1,$2,$3)}’
- 正则匹配日志中以某字符串开头的记录
$ cat access.log | awk ‘($7 ~ /\/icfekit\//) {print $0}’
$ cat access.log | awk ‘($7 !~ /\/icfekit\//) {print $0}’ # 取反
附录
- Access.log
127.0.0.1 - - [10/Jun/2020:16:05:27 +0800] "GET / HTTP/1.1" 499 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
127.0.0.2 - - [10/Jun/2020:16:05:28 +0800] "GET / HTTP/1.1" 499 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
127.0.0.4 - - [10/Jun/2020:16:05:29 +0800] "GET / HTTP/1.1" 499 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
127.0.0.1 - - [10/Jun/2020:16:05:30 +0800] "GET / HTTP/1.1" 200 3467 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"