awk 文本处理速记:按列取数、求和与去重

举报
yd_270610013 发表于 2026/11/08 15:30:38 2026/11/08
【摘要】 日志、df、ps 的输出大多是按列排的,awk 就是按列取数的顺手工具。它不用写脚本,一行命令就能把一列数字取出来、筛一遍、再算个总数。下面是我平时最常用的六个点。一、先认清字段与分隔符awk 默认按空白分列,$1 是第一列,$2 是第二列,$NF 是最后一列。先用 print 把列号对上,再写条件,就不容易取错。ps aux | awk '{print $2, $11}'df -h | a...

日志、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、条件、求和、去重这六个点,日常看日志、看磁盘、看进程基本够用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。