Linux 文本处理入门:grep、sed 与 awk 三件套
刚接触 Linux 的新手,迟早会遇到这样的场景:日志文件几万行,只想找报错的那几行;配置文件几十处,要把旧域名批量换成新的;一列数字,要快速算出总和。打开编辑器一行行翻,既慢又容易漏。
其实这三件事各有一件专属工具:grep 负责找,sed 负责改,awk 负责算。学会它们,日常文本处理基本不用再手动翻文件。
小节一、grep:先把要找的行筛出来
grep 是三件套里最常用的,基本用法就是:
grep 关键词 文件名
比如在 Nginx 访问日志里找所有 404:
grep 404 access.log
想忽略大小写,加 -i;想看关键词在第几行,加 -n;只想数有多少行命中,加 -c。组合起来:
grep -in error app.log
意思是忽略大小写、显示行号,找出 app.log 里所有含 error 的行。记住一个习惯:先用 grep 把范围缩小,再对结果做下一步处理,不要一上来就对整个大文件动手。
小节二、sed:批量改,不用逐行编辑
sed 最常见的用法是替换,格式是:
sed s/旧内容/新内容/g 文件名
比如把配置文件里的旧域名换掉:
sed s/old.example.com/new.example.com/g config.txt
注意:这样只会把结果打印到屏幕,原文件并不会被改动,先看一眼结果对不对,确认无误再加 -i 真正写入文件:
sed -i s/old.example.com/new.example.com/g config.txt
-i 是直接改文件的意思,改之前最好先备份一份原文件,替换写错了还能恢复。sed 还能按行删内容,比如删掉所有空行:
sed /^$/d notes.txt
小节三、awk:按列算,按条件取
awk 把每一行按空格或指定分隔符切成列,第 1 列叫 $1,第 2 列叫 $2,以此类推。想取访问日志里的 IP 和状态码:
awk '{print $1, $9}' access.log
想统计某个接口被访问了多少次,先取列、再排序计数:
awk '{print $7}' access.log | sort | uniq -c | sort -nr
这行命令的意思是:取出第 7 列(请求路径),排序后去重计数,再按次数从多到少排。awk 还能直接算数,比如把一列数字求和:
awk '{sum += $2} END {print sum}' numbers.txt
小节四、三件套怎么配合
三件套真正的威力在组合。典型流程是:grep 先筛出关心的行,sed 或 awk 再对筛出来的结果加工。比如先找出所有报错行,再只看其中的时间列:
grep ERROR app.log | awk '{print $1, $2}'
再比如先批量替换,再验证替换结果:
sed -i s/old/new/g config.txt
grep new config.txt
管道符 | 把上一个命令的输出交给下一个命令,这就是 Linux 文本处理的标准姿势:每件工具只做一件事,组合起来解决完整问题。
小节五、三个新手常踩的坑
第一,grep 找不到内容,先检查关键词大小写和文件路径,多数时候不是工具坏了,是拼写或路径错了。
第二,sed 加 -i 之前没备份,替换规则写错后原文件直接被改坏,养成先不加 -i 预览、确认后再写入的习惯。
第三,awk 的列号从 $1 开始,$0 代表整行;列数不对时,先用 head 取一行出来数一数分隔符,别凭感觉猜。
grep 找、sed 改、awk 算,这三件套覆盖了日常文本处理的九成场景。下次再遇到几万行的日志,先别急着打开编辑器翻——一行 grep 缩小范围,再接 sed 或 awk 加工,往往几秒就出结果。
- 点赞
- 收藏
- 关注作者
评论(0)