Linux 常用文本处理三剑客 grep / sed / awk 入门
【摘要】 简要介绍 Linux 文本处理三剑客 grep、sed、awk 的基本用法与常用选项,附可直接运行的命令示例和组合使用场景。
在 Linux 日常运维和脚本编写中,有三个命令行工具出场率极高:grep、sed 和 awk。它们各有分工,又经常组合使用,被老手戏称为"文本处理三剑客"。本文简要介绍它们的基本用法和典型场景,并给出可直接复制运行的命令示例。
1. grep —— 在文本中搜索匹配的行
grep 用于从文件或标准输入中找出符合正则表达式的行。最常用的是管道配合其他命令使用。
常用选项:
-i:忽略大小写-v:取反,输出不匹配的行-n:显示行号-r:递归搜索目录下所有文件-c:只统计匹配行数-E:使用扩展正则表达式(等价于 egrep)
示例:
# 在日志中搜索 ERROR 并显示行号
grep -n "ERROR" /var/log/syslog
# 列出当前目录下递归包含 "TODO" 的文件
grep -rl "TODO" ./src
# 配合管道,从进程列表中过滤 nginx
ps aux | grep -v grep | grep nginx
2. sed —— 流式文本编辑
sed(stream editor)按行读取、根据规则修改、再输出,适合原地替换、插入、删除。
常用语法:
s/旧/新/flags:替换a\文本/i\文本:在行后/行前追加d:删除匹配行-i:就地修改文件(建议先用备份后缀如 -i.bak)
示例:
# 将文件中所有 http:// 替换为 https:// 并直接改原文件(先备份)
sed -i.bak 's|http://|https://|g' config.yml
# 删除空行
sed '/^$/d' notes.txt
# 在第 3 行后面插入一行注释
sed -i '3a\# 这是第3行后的注释' config.yml
在华为云 ECS 上批量修改 Nginx 配置时,sed 的 s 替换配合 -i.bak 是最稳妥的"改错可回退"做法。
3. awk —— 面向列的文本处理
awk 把每一行按分隔符切成字段($1、$2 … $NF),非常适合表格类数据的提取和计算。内置变量:
NF:字段数,$NF是最后一个字段NR:当前行号FS/-F:字段分隔符BEGIN/END:处理首尾逻辑
示例:
# 查看磁盘使用,只打印挂载点和可用百分比
df -h | awk '{print $6, $5}'
# 统计 /etc/passwd 中用了哪种 shell(最后一段)
awk -F: '{print $NF}' /etc/passwd | sort | uniq -c | sort -rn
# 求第三列总和
awk '{sum += $3} END {print "total:", sum}' data.csv
4. 组合使用:三剑客一起上
把它们串在管道里可以完成更复杂的工作流。
示例 1:找日志里状态码 5xx 的请求,只保留 IP 和路径
grep " 5[0-9][0-9] " access.log | awk '{print $1, $7}'
示例 2:把配置文件里某段的 port 号全部 +10
sed -n '/server/,/}/p' nginx.conf | awk '/port/{gsub(/:/, ""); printf "%s:%d\n", substr($0,1,index($0," ")-1), $NF+10}'
示例 3:快速统计某个服务占用最多的 5 个进程 PID
ps aux | grep java | grep -v grep | awk '{print $2}' | head -5
小结
- grep 负责"找行",sed 负责"改行",awk 负责"拆列计算"。
- 先用 grep 缩小范围,再用 awk 提取所需字段,最后用 sed 做格式微调,是一套常见的组合拳。
- 在华为云 ECS 上做日志排查、配置批量替换、资源统计时,优先用这三个工具往往比打开编辑器更快。
提示:sed 和 awk 的行为在不同发行版(GNU vs BSD/macOS)可能略有差异。在 macOS 上建议安装 GNU 版本:
brew install gnu-sed gawk,或使用兼容写法。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)