Linux 文件查找与文本处理:find、grep、sed、awk 组合实战
在日常的 Linux 运维和开发工作中,文件查找与文本处理是最常用、也最容易被低估的基本功。日志里定位一次报错、批量修改一批配置文件、从访问日志里统计出访问量最高的接口,这些任务单靠一个命令往往只能解决一半问题,而把 find、grep、sed、awk 四个工具按流水线组合起来,才能真正做到又快又准。本文结合真实场景,讲清每个工具的定位与组合方法。
一、find:先把目标文件找出来
find 的职责是按条件筛选文件,它可以在指定目录下按名称、类型、修改时间、大小等条件查找,是后续一切处理的前提。按名称查找最常用,例如在当前目录及子目录中找出所有的日志文件:find . -name "*.log"。按类型限定为普通文件:find /var/log -type f -name "*.log"。按修改时间找最近 7 天内改动过的文件:find . -type f -mtime -7。按大小找超过 100MB 的文件:find . -type f -size +100M。需要提醒的是,文件名可能包含空格,配合 xargs -0 使用才能避免路径被截断,例如 find . -name "*.log" -print0 | xargs -0 grep -l "ERROR"。
二、grep:按内容逐行过滤
grep 的职责是对文本内容按行过滤,支持正则表达式。-r 表示递归搜索目录,-n 显示行号,-i 忽略大小写,-v 反向排除,-E 使用扩展正则。排查线上问题时,最常见的组合是先由 find 圈定文件范围,再由 grep 筛选内容:find . -name "*.log" -exec grep -Hn "ERROR" {} \;,这样既能看到文件名,又能看到行号。只想知道哪些文件包含关键字时用 -l:grep -rl "OutOfMemoryError" /var/log。统计错误出现的次数也很方便:grep -c "ERROR" app.log,或者把结果交给 wc -l 统计行数。
三、sed:按行做替换与删改
sed 是流编辑器,最擅长对文本做替换、删除和提取。最常用的是替换命令 s/old/new/g,配合 -i 参数可以直接修改文件,例如批量替换配置文件里的旧地址:sed -i 's/192.168.1.10/192.168.1.20/g' config.properties。修改重要配置文件之前,建议先不加 -i 验证输出,确认无误后再执行,并保留一份备份。删除空行也很方便:sed '/^$/d' app.log。只打印某个区间,比如第 10 到第 20 行:sed -n '10,20p' app.log。sed 的替换支持正则和分组引用,例如把日期格式从 2026/11/10 改为 2026-11-10:sed -E 's#([0-9]{4})/([0-9]{2})/([0-9]{2})#\1-\2-\3#g'。
四、awk:按列做分析与统计
awk 的强项是结构化文本的列处理,它把每一行按分隔符拆成字段,用 $1、$2、$NF 分别表示第一列、第二列和最后一列,-F 可以指定分隔符。分析 Nginx 访问日志时,一行命令就能统计出访问量最高的十个 IP:awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10。awk 还支持条件判断和数值计算,例如统计所有返回 5xx 的请求数量:awk '$9 >= 500 && $9 < 600' access.log | wc -l。求某一列的和与平均值:awk '{sum += $10} END {print sum, sum/NR}' access.log。配合 BEGIN 和 END,awk 能够在处理前后输出表头和汇总结果,非常适合写小型统计脚本。
五、组合实战:一条流水线完成排查、修改与统计
场景一,清理历史日志:找出 7 天前、超过 100MB 的日志文件,先列出来确认,再压缩归档:find /var/log -type f -name "*.log" -mtime +7 -size +100M -exec gzip {} \;。场景二,批量替换配置:先用 grep 确认哪些文件包含旧地址,再用 sed 统一替换:grep -rl "192.168.1.10" /etc/myapp/ | xargs sed -i 's/192.168.1.10/192.168.1.20/g'。场景三,接口耗时分析:从日志中提取接口路径和耗时,按接口分组计算平均耗时并排序:awk '{print $7, $NF}' access.log | sort | awk '{sum[$1]+=$2; cnt[$1]++} END {for (k in sum) print k, sum[k]/cnt[k]}' | sort -k2 -nr | head -10。这条流水线里,第一个 awk 负责提取列,第二个 awk 负责分组聚合,分工清晰。
六、使用时需要注意的几个细节
第一,find 与 xargs 组合时优先使用 -print0 和 -0,文件名带空格也不会出错。第二,sed -i 会直接修改文件,执行前务必备份或先去掉 -i 检查输出结果。第三,grep 的正则中特殊字符需要转义,复杂模式建议使用 -E。第四,awk 按列处理时先确认分隔符,默认按空白分隔,CSV 这类逗号分隔的文件要指定 -F','。第五,组合命令越长越要拆开调试,先确认每一步的输出,再用管道串起来,避免最后一步出错却找不到源头。
小结:find 负责找文件,grep 负责筛内容,sed 负责改文本,awk 负责算统计。四者组合成流水线之后,绝大多数日志排查、配置批量修改和访问统计工作,都可以在命令行里一次完成。把这套组合练熟,是每个 Linux 用户从会用命令到高效运维的关键一步。
- 点赞
- 收藏
- 关注作者
评论(0)