
在 Linux 命令行里跟文本打交道绕不开grep、sed、awk这三条命令。看日志、改配置、从一堆 CSV 里抽几列做统计手敲十分钟 Python 能解决的事这仨一行管道就能搞定。这一篇先把三者的分工、各自擅长的活和经典协作模式讲清楚后面四篇再分别钻进去。一、三兄弟各管一摊很多教程一上来就把参数表砸过来看完还是不知道什么时候用谁。先用一句话把分工钉死grep 负责找从一堆行里把符合条件的挑出来。sed 负责改把找到的行做替换、删除、插入。awk 负责切和算把每行按字段拆开做过滤、计算、汇总。命令核心动作输入输出像什么grep按模式匹配行文本流匹配到的行筛子sed流式编辑文本流编辑后的文本流流水线改字工awk按字段解析、编程文本流加工后的记录小型报表引擎记忆点很朴素grep 只动行这个粒度sed 在字符和行之间改awk 把行拆成字段做计算。理解这个粒度差异后面所有参数都好记。二、先准备一个贯穿全文的测试文件后面四篇都要反复跑示例先把这个employees.csv放当前目录101,张三,研发部,北京,18000 102,李四,研发部,上海,22000 103,王五,产品部,北京,25000 104,赵六,设计部,深圳,19000 105,钱七,研发部,北京,18000 106,孙八,产品部,上海,26000 107,周九,设计部,北京,21000 108,吴十,研发部,杭州,23000字段顺序工号、姓名、部门、城市、月薪。列名顺手记一下后面-F,切字段全靠它。三、grep把想要的行捞出来语法骨架grep[选项]模式文件...最小可用示例找所有在北京的员工记录grep北京employees.csv预期输出101,张三,研发部,北京,18000 103,王五,产品部,北京,25000 105,钱七,研发部,北京,18000 107,周九,设计部,北京,21000grep 默认是整行匹配就打印整行它不关心你要的是哪一列。想只挑研发部的北京员工grep本身也能干但要写正则把字段也匹配上这时候用 awk 会干净得多——后面会看到对比。高频参数速览参数作用-r递归搜目录-i忽略大小写-v反向匹配不想要哪些行-n显示行号-c只输出匹配到几行-E启用扩展正则 ?-o只输出匹配到的那一段不是整行-A 2 / -B 2 / -C 2显示匹配行的后/前/前后 2 行这张表后面第 52 篇会逐条展开。四、sed流式编辑器改字专用语法骨架sed[选项]编辑命令文件...最常用的编辑命令就是替换s/旧/新/。最小可用示例把文件里所有的北京改成Beijingseds/北京/Beijing/gemployees.csv预期输出101,张三,研发部,Beijing,18000 102,李四,研发部,上海,22000 103,王五,产品部,Beijing,25000 104,赵六,设计部,深圳,19000 105,钱七,研发部,Beijing,18000 106,孙八,产品部,上海,26000 107,周九,设计部,Beijing,21000 108,吴十,研发部,杭州,23000注意几个细节默认情况下 sed 把结果打到屏幕上原文件不动。想直接改文件加-iGNU 版本或者自己重定向 employees.csv.new。结尾那个g表示一行里替换所有匹配。不加g只换每行第一个。斜杠/是分隔符路径里出现斜杠时换成#或|更省事比如sed s#/usr/local#/opt#。sed 还能干删除行、插入行、按行号范围操作第 53 篇细讲。五、awk把行切成字段做计算语法骨架awk模式 { 动作 }文件...awk 最反直觉的一点它不写动作时默认打印整行写了{ print }也打印整行。真正的威力在字段变量。最小可用示例打印所有研发部员工的姓名和月薪awk-F,$3 研发部 { print $2, $5 }employees.csv预期输出张三 18000 李四 22000 钱七 18000 吴十 23000这里-F,告诉 awk 用逗号切字段默认是任意空白。$3是第三列部门$2是姓名$5是月薪。条件$3 研发部就是模式花括号里是命中后执行的动作。再看一个带计算的把北京员工的月薪加起来awk-F,$4 北京 { sum $5 } END { print sum }employees.csv预期输出82000END块在文件读完后执行一次。这种边读边累加、读完出结果的结构awk 写起来比任何脚本都短。六、经典管道组合单个命令的本事其实有限真正的威力来自把它们用管道串起来。看一个贴近工作的例子从 employees.csv 里找出研发部员工把研发部三个字替换成 “RD”最后只打印姓名和城市。grep研发部employees.csv|seds/研发部/RD/|awk-F,{ print $2, $4 }预期输出张三 北京 李四 上海 钱七 北京 吴十 杭州分工是这样的grep先把非研发部的行扔掉。sed把剩下行里的研发部换成RD。awk按逗号切开只挑第二列和第四列打印。实际工作里还有一种更常见的形态日志分析。访问日志动辄几十 GBgrep先把错误行捞出来awk统计每个状态码出现次数sort | uniq -c | sort -nr排个序一条命令跑完别人开 Jupyter 还没把数据 load 完。七、⚠️ 新手最容易踩的三个坑把正则元字符当成普通字符写。grep a.b里的.匹配任意字符不是字面的点。想匹配真实的点要写grep a\.b。这个坑在第 52、55 篇会反复碰到。以为sed改了原文件。不带-i时 sed 只输出到屏幕原文件一字节不变。想真正落盘GNU sed 用sed -i s/.../.../ 文件macOS 自带 BSD sed 要写sed -i s/.../.../ 文件多一个空字符串参数。跨平台脚本里这点最容易翻车。用错字段分隔符。/etc/passwd是冒号分隔CSV 是逗号分隔Nginx 默认日志是空格分隔。忘了-F或者-F给错了awk 切出来的字段全是错的而且它不报错只是静默地给你一个看起来很像样的错误结果。八、知识扩展三剑客和正则表达式到底是什么关系很多人把三剑客和正则混在一起学越学越乱。其实它们是两层东西正则表达式是一套描述文本模式的语言不是某个命令。grep、sed、awk 是三种会读正则的工具各自实现了不同版本的正则引擎。具体差异工具默认正则方言启用扩展正则grepBRE基本正则grep -E或egrepsedBREsed -EGNU sed 也支持sed -rawkERE扩展正则默认就是 ERE这就是为什么写grep ab匹配不到任何东西得写grep -E ab。在 BRE 里是字面字符要写成\才有一次或多次的含义。而在 awk 里默认就是元字符。这种转义差异面试常考第 55 篇会把 BRE、ERE、PCRE 三方对照表完整列出来。还有一个现代选择值得知道grep的替代品ripgrep命令名rg、ag、ugrep默认就是 PCRE2速度还快一个数量级递归搜代码库时强烈建议装一个。但它们不是 Linux 自带面试和运维场景默认还是 GNU grep。九、什么时候别硬上三剑客三剑客很强但不是万能的。知道边界比知道技巧更重要JSON 日志别用 grepsed 硬抠字段jq才是正解。grep status:500 access.log | awk ...能跑但写出来的正则一升级格式就崩。大文件里改一处配置用 sed-i很爽但文件上 GB 级、还要做事务性回滚时考虑写个 Python 脚本sed 的错误信息对非技术人员不友好。复杂表格统计透视、分组求和、多表 joinawk 写起来会越来越长超过 30 行还在堆条件就该上 Python/pandas 了。二进制文件别 grep加-a强行当文本搜出来的结果基本没意义。file先看一眼是什么。下一篇从grep开始把递归搜索、排除目录、上下文行、反向匹配这些高频用法一次讲透。