《Linux 文本处理入门:grep、sed、awk 各干什么》
《Linux 文本处理入门:grep、sed、awk 各干什么》
先说结论
在 Linux 上处理文本,三个工具最常用:grep 负责找,sed 负责改,awk 负责算。三者分工不同,记住一句话就够了——找行用 grep,改内容用 sed,按列处理用 awk。新手不用一次全学会,先把每个工具最常用的那一个用法练熟,日常工作基本够用。
一、grep:先把含关键字的行找出来
grep 是最常用的文本查找工具,基本用法是 grep 关键字 文件名。比如在日志里找所有报错的行:
grep ERROR app.log
几个日常高频选项值得记住。-n 显示行号,定位问题时很有用;-i 忽略大小写,error 和 ERROR 都能命中;-r 递归查整个目录,适合在项目里找某个配置项出现在哪;-v 反向筛选,排除掉含关键字的行,比如看日志时先去掉无用的调试信息。
一个实用组合是 grep 配管道:先用别的命令产出内容,再用 grep 过滤。例如查看正在运行的进程,只关心含 python 的那几行:
ps aux | grep python
注意这里会多出一行 grep 自身的进程,知道这回事就行,不用深究。
二、sed:不打开文件也能改内容
sed 是流编辑器,最常见的用法是替换文本。基本格式是 sed 's/旧内容/新内容/' 文件名,只替换每行第一次出现的位置;想把一行里所有出现都换掉,在末尾加 g:
sed 's/192.168.1.10/192.168.1.20/g' config.txt
默认情况下 sed 只把结果打印到屏幕,不改原文件。确认替换结果没错后,加上 -i 选项才会真正写回文件。改重要文件之前,先备份一份原文件是个好习惯,改错了还能恢复。
除了替换,sed 还能按行号删行。sed '3d' 文件名 删除第 3 行,sed '1,5d' 文件名 删除第 1 到第 5 行。日常用得最多的还是替换,删行属于顺带记住的用法。
三、awk:按列切分,再做统计
awk 擅长处理按列排列的文本,默认按空格或制表符分列。$1 是第一列,$2 是第二列,$0 是整行。比如从 ps 的输出里只取进程号和命令名:
ps aux | awk '{print $2, $11}'
awk 还能顺手做统计。awk '{sum += $5} END {print sum}' 文件名 可以把第五列全部加起来,算磁盘占用、求访问量都很方便。END 表示所有行处理完之后再执行一次,常用来输出汇总结果。
一个新手容易踩的坑:awk 的列号是从 1 开始数的,$0 才是整行,别把 $1 当成整行用。
四、三个工具怎么配合
实际排查问题时,三个工具经常串起来用。先 grep 把可疑的行筛出来,再用 awk 取出关键的几列,最后用 sed 把格式整理干净。比如从访问日志里统计访问量最多的前十个地址:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
这条命令里 awk 取第一列,sort 排序,uniq -c 计数去重,再排序取前十。虽然出现了 sort、uniq、head,但思路是一样的:每一步只做一件小事,管道把它们连成一条流水线。
五、新手上路的三条建议
第一,先解决眼前的问题再学新选项,grep、sed、awk 各会三五个用法就能覆盖大部分日常场景。第二,改文件前先备份,sed -i 写回之前先不加 -i 看一遍输出。第三,命令太长就拆开,先看每一步的中间结果对不对,再拼成完整管道。
文本处理是 Linux 的基本功,不求一次记住所有参数,知道“找行、改内容、按列算”分别找谁,就已经入门了。
- 点赞
- 收藏
- 关注作者
评论(0)