Shell 文本处理三件套:grep、sed、awk 实战
在 Linux 服务器上排障、做运维,离不开文本处理:日志、配置文件、命令输出,本质上都是文本。grep、sed、awk 是 Shell 里的“三件套”——grep 负责找,sed 负责改,awk 负责算。本文讲清三者的常用组合,最后用一个 Nginx 访问日志分析的实战把它们串起来。
一、grep:先把想要的行找出来
grep 是最常用的过滤工具,核心思路是“先缩小范围,再精细加工”。-n 显示行号、-r 递归目录、-i 忽略大小写、-v 反选、-E 启用扩展正则,是日常最常用的五个选项。
grep -rn "error" /var/log/nginx/
grep -ri "timeout" app.log
grep -v "healthcheck" access.log
grep -E '" (4[0-9]{2}|5[0-9]{2}) ' access.log
管道二次过滤比一次写复杂正则更稳:grep "2026-11-14" app.log | grep -v "INFO" | grep "ERROR"。
二、sed:行内替换与删除
sed 是流编辑器,最常用的是替换 s///g 和按行删除,适合批量改配置。s///g 的 g 表示每行内全部替换,不加 g 只替换每行第一个。
sed -i 's/127.0.0.1/0.0.0.0/g' app.conf
sed -i.bak 's/debug=false/debug=true/g' app.conf
sed -i '/^$/d; /^#/d' app.conf
sed -i '10d' data.txt
sed -i '2,5d' data.txt
注意:-i 直接改文件,务必先备份或加 .bak 后缀;分隔符不一定用 /,路径里斜杠多时可换成 #,例如 sed -i 's#/var/log#/data/log#g' app.conf。
三、awk:按列提取与统计
awk 按列处理文本,适合结构化日志和报表统计。默认按空白分隔,-F 指定分隔符,$1 是第一列,$NF 是最后一列;NR 是行号,$0 是整行。
awk '{print $1, $9}' access.log
awk -F: '{print $1, $NF}' /etc/passwd
awk '{count[$9]++} END {for (c in count) print c, count[c]}' access.log
awk '{sum += $10} END {print "总流量:", sum}' access.log
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
四、组合实战:分析 Nginx 访问日志
先用 grep 粗筛出今天的请求,再用 awk 统计 TOP 10 IP 与状态码分布。
grep "14/Nov/2026" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
grep "14/Nov/2026" /var/log/nginx/access.log | awk '{count[$9]++} END {for (c in count) print c, count[c]}' | sort -rn -k2
思路是固定的:grep 定范围、awk 取列算数、sort + uniq -c 做排名。遇到新日志,先看一行长什么样,数清列号,再套模板。
五、小结
找行用 grep,改文本用 sed,算统计用 awk;实战套路是 grep 定范围 → awk 取列统计 → sort | uniq -c 排名。
- 点赞
- 收藏
- 关注作者
评论(0)