awk 文本处理速记:按列取数、求和与去重
日志、df、ps 的输出大多是按列排的,awk 就是按列取数的顺手工具。它不用写脚本,一行命令就能把一列数字取出来、筛一遍、再算个总数。下面是我平时最常用的六个点。
一、先认清字段与分隔符
awk 默认按空白分列,$1 是第一列,$2 是第二列,$NF 是最后一列。先用 print 把列号对上,再写条件,就不容易取错。
ps aux | awk '{print $2, $11}'
df -h | awk '{print $1, $5}'
如果列之间是冒号,就用 -F 指定分隔符:
awk -F: '{print $1, $3}' /etc/passwd
二、按条件筛行
awk 的条件写在花括号前面,符合条件的行才会执行后面的动作。
只看使用率超过 80% 的磁盘:
df -h | awk '$5+0 > 80 {print $1, $5}'
只看返回 404 的请求,把请求的路径打出来:
awk '$9 == 404 {print $7}' access.log
这里 $5+0 是把“80%”转成数字再比较的小技巧。
三、求和与计数
把第三列全部加起来,END 里的动作只在最后执行一次:
awk '{sum += $3} END {print sum}' data.txt
按第一列分组计数,常用来看哪个 IP 访问最多:
awk '{count[$1]++} END {for (k in count) print k, count[k]}' access.log
四、去重与排序组合
awk 一行就能去重并保留原来的顺序:
awk '!seen[$0]++' file.txt
再和 sort、uniq 配合,就能排出访问量前十的 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
五、一个晨间小例子
早上看服务器,先看三行:磁盘有没有超过 80%,内存还剩多少,昨天 404 最多的三个路径。上面四组命令拼起来,不到一分钟就能看完。
六、容易踩的坑
一是分隔符不对:列之间是多个空格时不用 -F,默认空白分隔最稳;二是忘记加 END,求和的结果会在每一行都打一次;三是 $5 这种带百分号的字段要先转数字再比较。
先记住 $1、$NF、-F、条件、求和、去重这六个点,日常看日志、看磁盘、看进程基本够用。
- 点赞
- 收藏
- 关注作者
评论(0)