引言
在 Linux 系统管理和日常开发中,处理文本数据是一项高频且核心的任务。无论是分析日志、提取信息、批量修改配置文件,还是进行数据清洗和转换,命令行下的文本处理工具都扮演着至关重要的角色。其中,grep、sed 和 awk 被誉为“文本处理三剑客”,它们功能强大、组合灵活,是每一位开发者和运维人员必须掌握的利器。
本文将为你提供一份关于 grep、sed 和 awk 的常用指南,涵盖核心概念、基础语法、经典用例以及组合技巧,帮助你快速上手并高效解决实际问题。
1. grep:文本搜索利器
grep(Global Regular Expression Print)用于在文件中搜索匹配指定模式的行,并将匹配到的行打印出来。它是快速定位信息的首选工具。
1.1 基本语法与常用选项
grep [选项] '模式' [文件...]
常用选项:
-i:忽略大小写-v:反向选择,即打印不匹配的行-n:显示匹配行的行号-c:只显示匹配行的数量(计数)-r或-R:递归搜索目录下的所有文件-l:只打印包含匹配项的文件名-E:启用扩展正则表达式(等同于egrep)-A NUM:打印匹配行及其后 NUM 行-B NUM:打印匹配行及其前 NUM 行-C NUM:打印匹配行及其前后各 NUM 行
1.2 常用示例
-
在文件中搜索关键词:
grep 'error' /var/log/syslog -
忽略大小写搜索:
grep -i 'warning' app.log -
递归搜索目录:
grep -r 'TODO' /home/user/project/ -
显示行号及上下文:
grep -n -C 2 'fatal' server.log -
使用正则表达式:
# 匹配以 `DEBUG` 开头的行 grep '^DEBUG' app.log # 匹配包含 `192.168` 的 IP 地址 grep -E '192\.168\.[0-9]{1,3}\.[0-9]{1,3}' access.log
2. sed:流编辑器
sed(Stream Editor)是一个非交互式的流编辑器,用于对输入流(文件或管道)进行基本的文本转换。它按行处理,非常适合执行查找替换、删除、插入等操作。
2.1 基本语法与常用命令
sed [选项] '命令' [输入文件]
常用命令:
s:替换(substitute)d:删除(delete)p:打印(print)i:在指定行前插入(insert)a:在指定行后追加(append)
常用选项:
-n:静默模式,只显示处理后的行(常与p命令配合)-i:直接修改原文件(谨慎使用,建议先不加-i测试)-e:允许多个命令
2.2 常用示例
-
替换文本(最常用):
# 将文件中所有的 `foo` 替换为 `bar`(每行只替换第一个匹配) sed 's/foo/bar/' file.txt # 全局替换(每行所有匹配) sed 's/foo/bar/g' file.txt # 替换并直接修改原文件 sed -i 's/foo/bar/g' file.txt -
删除行:
# 删除包含 `debug` 的行 sed '/debug/d' file.txt # 删除第 10 到 20 行 sed '10,20d' file.txt # 删除空行 sed '/^$/d' file.txt -
打印特定行:
# 打印第 5 行 sed -n '5p' file.txt # 打印第 10 到 15 行 sed -n '10,15p' file.txt -
插入与追加文本:
# 在第 3 行前插入一行 “INSERT BEFORE” sed '3i\INSERT BEFORE' file.txt # 在第 3 行后追加一行 “APPEND AFTER” sed '3a\APPEND AFTER' file.txt
3. awk:文本处理与报告生成器
awk 不仅仅是一个命令,更是一门功能强大的文本处理编程语言。它擅长处理基于列(字段) 的结构化文本(如 CSV、日志),可以执行计算、格式化输出、生成报告等复杂操作。
3.1 基本语法与工作原理
awk '模式 { 动作 }' [文件...]
awk 将输入文件的每一行视为一条记录,默认以空格或制表符为分隔符将记录分割成若干字段($1, $2, … $NF)。$0 代表整行。
内置变量:
NR:当前处理的行号(Record Number)NF:当前行的字段数量(Number of Fields)FS:输入字段分隔符(Field Separator),默认为空格OFS:输出字段分隔符(Output Field Separator),默认为空格RS:输入记录分隔符(Record Separator),默认为换行符ORS:输出记录分隔符,默认为换行符
3.2 常用示例
-
打印特定列:
# 打印 /etc/passwd 的第一列(用户名)和第三列(用户ID) awk -F: '{print $1, $3}' /etc/passwd -
条件过滤与计算:
# 打印第二列大于 100 的行 awk '$2 > 100 {print $0}' data.txt # 计算第一列的总和 awk '{sum += $1} END {print sum}' numbers.txt # 统计文件行数(等同于 wc -l) awk 'END {print NR}' file.txt -
修改输出格式:
# 以冒号重新连接字段 awk -F, '{print $1 ":" $2 ":" $3}' data.csv # 格式化输出,如“用户: 张三, 年龄: 25” awk -F, '{printf "用户: %s, 年龄: %d\n", $1, $2}' users.csv -
使用 BEGIN 和 END 块:
# 在处理前设置分隔符,处理后打印总结 awk 'BEGIN {FS=":"; OFS="\t"; print "User\tUID"} {print $1, $3} END {print "Total users:", NR}' /etc/passwd
4. 组合使用:威力倍增
将 grep、sed、awk 通过管道 (|) 组合,可以解决更复杂的问题。
-
查找包含特定内容的行,并提取某一列:
# 在日志中查找包含 “POST” 的请求,并提取其时间戳(假设为第4列) grep 'POST' access.log | awk '{print $4}' -
替换文本后,再进行过滤:
# 将配置文件中的 “localhost” 替换为 “127.0.0.1”,然后过滤掉注释行(以#开头) sed 's/localhost/127.0.0.1/g' config.conf | grep -v '^#' -
复杂数据提取与格式化:
# 分析日志,统计每个IP的访问次数,并按访问量降序排列 awk '{print $1}' access.log | sort | uniq -c | sort -nr # 上述命令分解: # 1. awk '{print $1}' 提取第一列(IP地址) # 2. sort 排序,为 uniq 做准备 # 3. uniq -c 统计每个唯一IP的出现次数 # 4. sort -nr 按次数数字降序排列
5. 总结与进阶建议
- grep 擅长快速查找和过滤。记住
-r,-n,-C等选项会让你事半功倍。 - sed 擅长基于行的简单编辑,尤其是批量替换。使用
-i选项修改文件前务必先测试。 - awk 擅长处理结构化的列数据和执行复杂逻辑。掌握
NR、NF、FS等内置变量是关键。
学习建议:
- 从常用场景入手:先解决手头的问题,如用
grep查日志,用sed改配置。 - 善用
man手册:man grep、man sed、man awk是最权威的参考资料。 - 组合练习:尝试用管道将多个命令串联,体会数据流处理的魅力。
- 安全性:对重要文件操作时,先使用不带
-i的sed或在副本上测试。
掌握这三剑客,你将能优雅且高效地应对绝大多数命令行下的文本处理任务,极大提升工作效率。
1470

被折叠的 条评论
为什么被折叠?



