主题
文本处理三剑客
Linux系统中,grep、sed、awk被称为文本处理三剑客,它们是处理文本文件的强大工具。
grep - 文本搜索工具
grep(Global Regular Expression Print)是一个强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
常用用法
bash
# 在文件中搜索包含"error"的行
grep "error" filename.log
# 忽略大小写搜索
grep -i "error" filename.log
# 显示行号
grep -n "error" filename.log
# 递归搜索目录
grep -r "error" /var/log/
# 反向匹配(不包含error的行)
grep -v "error" filename.log
# 显示匹配的文件名
grep -l "error" *.log
# 使用正则表达式
grep -E "error|warning" filename.log1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sed - 流编辑器
sed(Stream Editor)是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space)。
常用用法
bash
# 替换文本(只替换每行第一个匹配)
sed 's/old/new/' filename
# 全局替换(替换每行所有匹配)
sed 's/old/new/g' filename
# 删除行
sed '3d' filename # 删除第3行
sed '/error/d' filename # 删除包含error的行
# 插入行
sed '1i\# 新增的第一行' filename
# 追加行
sed '$a\# 最后一行后面' filename
# 修改文件(-i参数会直接修改原文件)
sed -i 's/old/new/g' filename
# 多个操作
sed -e 's/old/new/g' -e '/error/d' filename1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
awk - 文本分析工具
awk是一个强大的文本分析工具,相对于grep的查找、sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
基本语法
bash
awk 'pattern {action}' filename1
常用用法
bash
# 打印整行
awk '{print}' filename
awk '{print $0}' filename
# 打印特定列
awk '{print $1}' filename # 第1列
awk '{print $1, $3}' filename # 第1和第3列
# 指定分隔符
awk -F: '{print $1}' /etc/passwd
awk 'BEGIN{FS=":"} {print $1}' /etc/passwd
# 条件过滤
awk '$3 > 100 {print}' filename
awk '/error/ {print}' filename
# 内置变量
awk 'NR==3 {print}' filename # 第3行
awk 'NF>5 {print}' filename # 字段数大于5的行
awk 'END {print NR}' filename # 总行数
# 计算和统计
awk '{sum+=$3} END {print sum}' filename
awk '{count++} END {print count}' filename
# 格式化输出
awk '{printf "%-10s %5d\n", $1, $3}' filename1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
实际应用示例
日志分析
bash
# 统计nginx日志中不同状态码的数量
awk '{print $9}' access.log | sort | uniq -c | sort -nr
# 找出访问量最高的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -101
2
3
4
5
2
3
4
5
系统监控
bash
# 查看内存使用情况
free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
# 查看磁盘使用率
df -h | awk '$5+0 > 80 {print $1 " is " $5 " full"}'1
2
3
4
5
2
3
4
5
文本处理
bash
# 批量修改文件扩展名
ls | awk '{print "mv " $1 " " substr($1,1,length($1)-3) ".txt"}' | sh
# 提取IP地址
ifconfig | awk -F'[ :]+' '/inet addr/{print $4}'1
2
3
4
5
2
3
4
5
总结
- grep:主要用于文本搜索和过滤
- sed:主要用于文本编辑和替换
- awk:主要用于文本分析和报告生成
这三个工具经常配合使用,可以通过管道符连接起来,构建强大的文本处理流水线,是Linux系统管理员和开发者的必备技能。