掌握Linux文本处理三剑客,轻松玩转日志分析与数据提取!
一、为什么是这三个命令?
在Shell脚本开发中,grep、sed、awk 被公认为文本处理三剑客:
-
grep:文本搜索利器 -
sed:流编辑器(批量替换/删除) -
awk:报表生成器(结构化处理)
掌握它们能解决90%的文本处理需求!
二、grep:文本搜索专家
1. 基础搜索
# 在文件中搜索"error"
grep "error" server.log
# 忽略大小写搜索
grep -i "Error" server.log
2. 实用参数大全
| 参数 | 作用 | 示例 |
|
| 反向匹配(排除) |
|
|
| 显示行号 |
|
|
| 递归搜索目录 |
|
|
| 显示匹配行后的N行 |
|
|
| 显示匹配行前的N行 |
|
|
| 统计匹配次数 |
|
3. 正则表达式实战
# 查找以"2024"开头的行
grep "^2024" logs.txt
# 查找包含"err"或"warn"的行
grep -E "err|warn" system.log
# 查找IP地址
grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log
三、sed:流编辑大师
1. 基础替换
# 替换文件中的"old"为"new" (仅输出到终端)
sed 's/old/new/' file.txt
# 直接修改文件(加-i参数)
sed -i 's/foo/bar/g' config.conf
2. 核心语法解析
s/pattern/replacement/[flags]
| 标志 | 作用 |
|
| 全局替换 |
|
| 打印修改的行 |
|
| 忽略大小写 |
3. 实用技巧
➤ 删除空行
sed '/^$/d' file.txt
➤ 替换指定行
# 替换第5行的内容
sed '5 s/old/new/' data.txt
➤ 范围操作
# 删除10-20行
sed '10,20d' log.txt
# 在匹配行后插入文本
sed '/pattern/a INSERT_TEXT' file
➤ 多命令执行
sed -e 's/foo/bar/' -e '/baz/d' file.txt
四、awk:数据处理神器
1. 基础结构
awk 'pattern {action}' file
2. 核心概念
| 变量 | 含义 |
|
| 整行内容 |
|
| 第一列 |
|
| 列数 |
|
| 当前行号 |
|
| 输入字段分隔符 |
3. 常用操作
➤ 提取特定列
# 打印用户名(第1列)
awk -F: '{print $1}' /etc/passwd
➤ 条件过滤
# 显示第二列大于100的行
awk '$2 > 100' sales.txt
➤ 数据统计
# 计算第三列总和
awk '{sum+=$3} END{print sum}' data.txt
# 统计不同状态码出现次数
awk '{codes[$9]++} END{for(c in codes) print c, codes[c]}' access.log
4. 高级用法
# 自定义输出格式
awk '{printf "User: %-10s UID: %d\n", $1, $3}' /etc/passwd
# 处理CSV文件
awk -F, 'NR>1 {print $2,$5}' data.csv
# 关联多个文件
awk 'NR==FNR{a[$1]=$2; next} {print $0, a[$1]}' map.txt data.txt
五、三剑客组合实战
场景:分析Nginx访问日志
# 1. 提取2024年的500错误
grep "2024" access.log | grep " 500 "
# 2. 删除无用的查询参数
sed 's/?.*//' | sed 's/\?.*//'
# 3. 统计最常出错的URL
awk '{print $7}' | sort | uniq -c | sort -nr | head -10
场景:批量重命名文件
ls *.jpg | sed 's/^/prefix_/' | xargs -I {} mv {} prefix_{}
场景:提取配置文件中有效项
grep -v "^#" config.conf | sed '/^$/d' | awk -F= '{print $1}'
六、命令对比表
| 任务 | grep | sed | awk |
| 文本搜索 | ✅ 最佳选择 | ⚠️ 可用 | ⚠️ 可用 |
| 文本替换 | ❌ 不支持 | ✅ 最佳选择 | ⚠️ 可用 |
| 列数据处理 | ❌ 不支持 | ⚠️ 有限支持 | ✅ 最佳选择 |
| 复杂计算 | ❌ 不支持 | ❌ 不支持 | ✅ 支持 |
| 保持原格式 | ✅ 保持原样 | ✅ 保持原样 | ⚠️ 可能改变格式 |
✨ 黄金法则:
七、学习资源
-
man grep/man sed/man awk- 原生手册永远是最佳参考 -
Grymoire三剑客教程- 经典在线教程
-
《sed & awk》- O'Reilly经典书籍
立即尝试这个命令测试你的理解:
echo -e "apple 2\norange 5\nbanana 3" | awk '{sum+=$2} END{print "Total:", sum}'
输出:Total: 10
欢迎在评论区分享你的三剑客使用技巧! 🚀

1356

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



