Linux 文本处理三剑客:grep、sed、awk 与管道重定向实战

在 Linux 上,处理日志、配置和数据的核心利器是 grep、sed、awk,再配上管道与重定向。本文用大量真实例子,带你掌握这套让效率翻倍的文本流水线。

如果你以为 Linux 命令只是一个个孤立的工具,那你就还没体会到它的精髓。Unix 哲学里最重要的一条是「每个程序只做好一件事,然后把它们用管道连起来」。在文本处理这个领域,grep、sed、awk 就是被连接得最频繁的三把尖刀,配合管道(|)和重定向(> >>),能组合出近乎无限的数据处理能力。这篇把它们讲透。

一、grep:在文本里捞关键词

grep 的作用是「按行筛选包含某模式的文本」。最常用的是 grep -i "error" app.log 忽略大小写找错误;grep -rn "TODO" src/ 递归搜索整个目录并带上行号;grep -v "^#" nginx.conf | grep -v "^$" 则用 -v 反选,把注释行和空行都滤掉,只留有效配置。还有 -E 开启扩展正则(等效 egrep),让你能用 error|warn 一次匹配多个词;-C 3 能连带显示匹配行上下各三行上下文,排错时极好用。记住正则基础:点号代表任意字符、星号代表重复零次以上、尖括号是行首、美元号是行尾。

二、sed:流式编辑与批量替换

sed 是「流编辑器」,最经典的用法是替换:sed 's/old/new/g' file 把每一行里的 old 全换成 new(不加 g 只换每行第一个)。想直接改文件要加 -i,而且最好留个备份:sed -i.bak 's/80/8080/g' nginx.conf 改完会留一个 .bak。sed 还能删行,比如 sed '/^$/d' 删空行、sed '5,10d' 删第 5 到 10 行,或者 sed -n '/START/,/END/p' 只打印两个标记之间的内容。一个跨平台坑:macOS 的 BSD sed 要求 -i 后面必须带备份后缀参数(哪怕是个空串),而 GNU sed 可以省略,写跨平台脚本时要留心。

三、awk:把文本当表格来算

awk 比前两者更像一门迷你语言,它按列处理文本。awk '{print $1}' file 打印第一列(默认以空白分隔);awk -F: '{print $1, $7}' /etc/passwd-F 指定冒号分隔,取出用户名和登录 shell;awk '{print NF, NR}' 能同时拿到每行的字段数和行号。它最强的地方是能做条件判断和累加:awk '$3 > 100 {print $1}' 只输出第三列大于 100 的行,awk '{sum+=$2} END{print sum}' 则把第二列全部加起来。处理带数字的日志和报表,awk 几乎是标配。

四、管道与重定向:把工具串成流水线

真正让三剑客发威的是管道 |:它把左边命令的输出,直接喂给右边命令当输入。比如 ps aux | grep nginx 在进程列表里筛出 nginx;cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head 这条经典流水线,能统计出访问你网站最多的前十个 IP。重定向则是控制「输出去哪」:> 覆盖写文件、>> 追加、2> 单独重定向错误、2>&1 把错误并到标准输出、2>/dev/null 直接丢弃错误。tee 更妙,它能一边输出到屏幕一边写文件,方便你边看边存档。

五、四个杀手级一行命令

理解了上面这些,你就能写出很多「一行搞定」的神操作。比如批量把 .txt 改名成 .bak:用 find 找出文件,交给 sed 拼出 mv 命令,再交给 bash 执行。再比如监控 Nginx 访问最多的 IP、找出占用内存最高的进程、或者备份 sshd 配置后批量改端口,全都能用 grep/sed/awk 加管道串出来。这些一行命令的价值不在于炫技,而在于把原本要写脚本才能做的事,在终端里十秒钟解决。建议把本文的例子存进你的笔记,遇到类似需求直接改着用。

六、把文本流水线写进脚本

把前面学的 grep、sed、awk 和管道串起来,你其实已经具备写「文本处理脚本」的能力了。比如服务器每天产生几十个日志,你想每天凌晨统计一次「昨天各接口的报错数」,完全可以写个几行的 shell 脚本:先用 grep 捞出昨天的 ERROR 行,再用 awk 按接口字段归类计数,最后把结果写入报表。这种自动化一旦跑起来,原本要花半小时的手工活就归零了。

这里有几个让脚本更稳的小技巧。第一,给命令加上明确的分隔符和错误处理,比如 awk 用 -F 指定分隔符时要确认源数据真的用这个分隔符;第二,处理含空格的文件名时,find 的输出尽量用 -print0 配合 xargs -0,避免文件名被空格截断;第三,正则里涉及特殊字符要记得转义或用 -F 固定字符串匹配,否则可能匹配到意料之外的行。脚本不怕简单,怕的是在某种边界数据下悄悄出错。

还有一个容易被忽略的点:这些文本工具默认按「行」工作,遇到超长行(比如被压缩成一行的 JSON 日志)时,grep 仍能匹配,但 sed 的按行处理就会显得笨拙,这时候可以换用支持多行的工具或者先把 JSON 用 jq 格式化再处理。理解每个工具的边界,才能在合适的场景选对工具,而不是拿锤子找钉子。

如果你想更进一步,可以去读一读各大开源项目的日志分析脚本,看别人是怎么把 grep/sed/awk 组合成生产级流水线的。看得多了你会发现,高手和新手用的常常是同一批命令,差别只在于:高手知道在什么数据下会翻车,并且提前写好了兜底。这,就是经验本身。

文本处理这三把刀,是区分普通用户和真正会用 Linux 的人的分水岭。很多人一辈子只会用鼠标打开文件、肉眼一行行找关键字,而懂了 grep、sed、awk 与管道的人,几秒钟就能从几万行日志里捞出想要的答案。这种差距不是智商的差距,而是是否掌握了把工具连成流水线的思维。我建议你不要满足于看懂本文的例子,而是挑一个自己真实的痛点,比如统计访问日志、批量改配置、提取报表数据,亲手用这套组合拳做一遍,只有在真实问题里反复用过,这些命令才会真正长在你的手上。请记住,工具的价值不在工具本身,而在你用它解决了什么;今天学会的每一招,都是你未来面对混乱数据时的一份从容。另外,文本处理也是入门编程思维最好的起点,因为正则、替换、字段与判断本质上已经在教你变量、条件和循环这些最核心的概念,很多后来的开发与运维高手,最早就是从玩转这几条命令开始,慢慢长出对数据和逻辑的直觉,所以别小看这一篇,它很可能是你从使用者迈向创造者的第一级台阶。

真正把文本处理学活的人,往往也是最早体会到自动化乐趣的人。当别人还在手工翻日志,你已经用一行管道拿到答案,这种差距会随时间越拉越大。所以请务必动手实践,让这些命令真正成为你的一部分,而不是停留在看过而已的层面。工具的威力从来不在被收藏,而在被使用,被反复使用,直到它和你融为一体,成为你思考问题时自然调用的那块肌肉。愿你在一次次真实的数据处理里,慢慢长出属于你自己的命令行直觉。

#grep #sed #awk #管道 #重定向 #文本处理 #Linux技巧