awk
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk
是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。
它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk
可能是最方便的工具。
awk其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。
基本使用
格式
awk 动作 文件名
示例
0}' demo.txt
前面单引号内部有一个大括号,里面就是每一行的处理动作print 0代表当前行,因此上面命令的执行结果,就是把每一行原样打印出来。
awk会根据空格和制表符,将每一行分成若干字段,依次用2、$3代表第一个字段、第二个字段、第三个字段等等。
$ echo 'this is a test' | awk '{print $3}'
a
修改默认的分隔符
# 按照空格符号进行分割
$ awk -F ':' '{ print $1 }' demo.txt
变量
$NF
变量NF表示当前行有多少个字段,因此(NF-1)代表倒数第二个字段。
$ awk -F ':' '{print $1, $(NF-1)}' demo.txt
root /root
daemon /usr/sbin
bin /bin
sys /dev
sync /bin
上面代码中,print命令里面的逗号,表示输出的时候,两个部分之间使用空格分隔。
NR
变量NR表示当前处理的是第几行。
$ awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync
上面代码中,print命令里面,如果原样输出字符,要放在双引号里面。
http://www.ruanyifeng.com/blog/2018/11/awk.html
https://gregable.com/2010/09/why-you-should-know-just-little-awk.html
统计nginx pv uv
查看nginx的配置确定每一列对应的含义
log_format main '$remote_addr - $remote_user [$time_local] "$request" "$request_body"'
'$status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_x_forwarded_for" '
'"$server_name" $request_time $upstream_response_time';
pv
awk '{print $1}' acces.log | sort | uniq -c | wc -l
# 分析
只输出第一列的结果
awk '{print $1}' acces.log
排序
sort
去重 并统计出现次数
uniq -c
去重之后即是uv
wc -l
root@app:/etc/nginx# wc /var/log/nginx/access.log
127627 3471552 102800749 /var/log/nginx/access.log
#文件的行数为、单词数、字节数
统计pv
直接求行数
awk '{print $1}' access.log|wc -l
求访问最频繁的ip地址
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more
sort -n : 按照数字排序,否则会按照字符串比较,就会出现2比11大
sort -k 1 : 指定列数,1是第一列。
sort -r : 按照相反的书序排序
求出前10的接口调用
awk '{print $1}' nginx_access.log | sort | uniq -c | sort -n -k 1 -r | head 10
-n -k 1 -r :按照数字排序第一列并求倒序
image.png
awk '{if(1}' nginx_access.log | sort | uniq -c | sort -n -k 1 -r | head 10
总结:
-F 指定分割字符 if 可以用来做为判断
awk -F ':' '{if($5==403) print $1}' nginx_access.log | sort | uniq -c | sort -n -k 1 -r | head 10