Linux 文本搜索入门:grep 与 sed 怎么用
在 Linux 服务器上排查问题时,最常面对的就是文本:日志文件、配置文件、命令输出。学会 grep 与 sed,就等于有了一把“先找出来、再改掉”的工具。本文面向零基础读者,只讲最常用、最安全的用法,全部命令都可以在自己的练习目录里先试一遍。
一、grep:负责“找”
grep 的基本格式是:grep [选项] 要找的内容 文件名。例如 grep "ERROR" app.log,会把 app.log 里包含 ERROR 的行全部打印出来。要注意,默认区分大小写;如果不确定大小写,就加 -i,例如 grep -i "error" app.log。
想知道出现在哪一行,加 -n;想知道出现多少次,加 -c;想反向排除,加 -v,例如 grep -v "DEBUG" app.log 可以过滤掉调试信息,让真正需要看的行更突出。想在整个目录里找,就加 -r,例如 grep -r "timeout" ./logs/。
新手常见的误区是把 grep 当成只能找固定词。其实它支持正则表达式,例如 grep -E "ERROR|WARN" app.log 可以同时找两种级别;点号、星号等符号有特殊含义,找字面符号时要转义或用 -F,例如 grep -F "192.168.1.1" app.log。记住:先用小范围文件练习,再去翻大日志。
二、sed:负责“改、删、取”
sed 的名字来自流编辑器,它按行处理文本,默认并不直接改文件,这一点对新手非常友好。最常用的是替换:sed 's/旧内容/新内容/' file.txt 只替换每行第一次出现;末尾加 g 才是全部替换,例如 sed 's/debug/info/g' app.log。
如果确实要改文件,一定要先备份再用 -i,例如先执行 cp config.txt config.txt.bak,然后执行 sed -i 's/8080/9090/g' config.txt。没有备份就直接用 -i,是新手最容易后悔的操作。
sed 还能按行号取内容:sed -n '1,20p' app.log 只看前 20 行;sed -n '10p' app.log 只看第 10 行。删除某类行也很方便:sed '/DEBUG/d' app.log 会删掉包含 DEBUG 的行,但同样只是输出结果,不改原文件。
分隔符不一定非用斜杠。当内容本身包含斜杠时,换成其他符号更清楚,例如 sed 's|/old/path|/new/path|g' file.txt。
三、两者配合:先定位,再处理
真实排查往往是组合使用。先用 grep 缩小范围,再用 sed 做整理,例如 grep "ERROR" app.log | sed 's/DEBUG//g',或者 grep -i "timeout" app.log | sed -n '1,50p'。管道符把前一个命令的输出交给下一个命令,这样不用生成中间文件。
再举一个配置场景:先用 grep -n "port" config.txt 找到端口所在行号,再用 sed -n '行号p' 查看上下文,确认无误后才做替换。这样的顺序比直接全局替换安全得多。
四、新手避坑清单
第一,命令里的引号不要乱省,单引号能防止 Shell 提前解释特殊符号。第二,替换前先不加 -i 看一遍输出,确认效果再落盘。第三,正则符号要按需转义,拿不准就先用 -F 做字面匹配。第四,不要在生产日志或重要配置上直接练习,先复制一份到练习目录。第五,命令没有输出不一定是错了,可能是关键词、大小写、路径或文件权限不对,先用 ls 和 head 检查文件是否存在、有没有内容。
五、动手小练习
在练习目录新建一个 app.log,写几行包含 INFO、WARN、ERROR 的日志,然后依次做:用 grep 找出 ERROR 行并显示行号;用 grep -v 过滤 INFO;用 sed 把 WARN 换成 WARNING 但不改原文件;最后用 sed -n 输出前 3 行。能把这四步顺利做完,日常看日志就基本够用了。
总结一句话:grep 帮你“找到关键行”,sed 帮你“改掉、删掉或取出一部分”。先找后改、先看后写,养成这个习惯,文本处理就会从“怕出错”变成“敢动手”。
- 点赞
- 收藏
- 关注作者
评论(0)