Linux三剑客:sed、grep、awk详解
Linux中的"三剑客"指的是三个强大的文本处理工具:grep、sed和awk。它们在文本搜索、替换和处理方面各有所长,经常被组合使用来解决复杂的文本处理问题。
1. grep - 文本搜索工具
grep (Global Regular Expression Print) 用于在文件中搜索匹配特定模式的行。
基本语法
grep [选项] 模式 [文件...]
常用选项
-i:忽略大小写-v:反向选择,显示不匹配的行-n:显示匹配行的行号-c:只显示匹配的行数-r或-R:递归搜索目录-l:只显示包含匹配项的文件名-w:全词匹配-A n:显示匹配行及其后n行-B n:显示匹配行及其前n行-C n:显示匹配行及其前后各n行
示例
# 在文件中搜索包含"error"的行
grep "error" logfile.txt
# 忽略大小写搜索
grep -i "error" logfile.txt
# 递归搜索目录中所有文件
grep -r "function" /path/to/dir
# 显示不包含"success"的行
grep -v "success" logfile.txt
# 统计匹配的行数
grep -c "warning" logfile.txt
2. sed - 流编辑器
sed (Stream Editor) 用于对输入流(文件或管道)进行基本的文本转换。
基本语法
sed [选项] '命令' 输入文件
常用选项
-e:指定要执行的命令-f:指定包含sed脚本的文件-i:直接修改文件内容(慎用)-n:取消默认输出,常与p命令一起使用
常用命令
s:替换p:打印d:删除a:追加i:插入c:更改行y:转换字符q:退出
示例
# 替换文件中的文本(不修改原文件)
sed 's/old/new/g' file.txt
# 直接修改文件(-i选项)
sed -i 's/old/new/g' file.txt
# 只打印匹配的行
sed -n '/pattern/p' file.txt
# 删除空行
sed '/^$/d' file.txt
# 替换第5行的内容
sed '5c\new line content' file.txt
# 多命令执行
sed -e 's/foo/bar/g' -e 's/baz/qux/g' file.txt
# 在每行行首添加内容
sed 's/^/# /' file.txt
# 删除第10-20行
sed '10,20d' file.txt
3. awk - 模式扫描和处理语言
awk是一种编程语言,用于在文件中查找和处理模式,特别适合处理结构化文本数据(如日志、CSV等)。
基本语法
awk '模式 {动作}' 输入文件
内置变量
NR:当前记录数(行号)NF:当前记录的字段数FS:字段分隔符(默认是空格)OFS:输出字段分隔符RS:记录分隔符ORS:输出记录分隔符FILENAME:当前文件名$0:整行内容$1, $2, ..., $n:第n个字段
常用功能
- 字段处理:自动按分隔符分割行
- 算术运算:支持各种数学运算
- 条件判断:if/else等控制结构
- 循环:for/while循环
- 数组:支持关联数组
- 格式化输出:类似C语言的printf
示例
# 打印文件的第一列和第三列
awk '{print $1, $3}' file.txt
# 打印行号及整行内容
awk '{print NR, $0}' file.txt
# 使用冒号作为分隔符
awk -F: '{print $1, $6}' /etc/passwd
# 打印行数大于10的行
awk 'NR > 10' file.txt
# 计算第一列数值的总和
awk '{sum += $1} END {print sum}' file.txt
# 打印字段数大于3的行
awk 'NF > 3' file.txt
# 条件判断示例
awk '{if ($3 > 1000) print $1, "high"; else print $1, "low"}' data.txt
# 使用BEGIN和END块
awk 'BEGIN {print "Start Processing"} {print $0} END {print "End Processing"}' file.txt
# 统计每行单词数
awk '{print NF, $0}' file.txt
# 处理CSV文件
awk -F, '{print $2, $5}' data.csv
三剑客组合使用示例
- 查找包含"error"的行并统计出现次数
grep -i "error" logfile.txt | wc -l
- 替换文件中的文本并保存到新文件
sed 's/old/new/g' input.txt > output.txt
- 提取日志中的时间戳和错误信息
awk '/ERROR/ {print $1, $2, $NF}' logfile.txt
- 查找并替换多个文件中的文本
grep -rl "oldtext" . | xargs sed -i 's/oldtext/newtext/g'
- 统计访问日志中每个IP的访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -nr
- 提取特定列并排序
awk -F: '{print $3, $1}' /etc/passwd | sort -n
- 复杂文本处理:提取、替换、统计
grep "GET" access.log | sed 's/.*\(192.168.1.[0-9]*\).*/\1/' | awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}'
总结
- grep:最适合简单的文本搜索和过滤
- sed:最适合基于行的文本转换和编辑
- awk:最适合结构化文本的处理和报告生成
掌握这三者可以高效地处理Linux系统中的各种文本处理任务,无需编写复杂的脚本程序。它们各自强大,组合使用时更是威力无穷。


1269

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



