Linux管道工具
Linux管道工具(|
)是文本处理的瑞士军刀,结合grep
、awk
、sed
可实现高效的数据流转。以下是详细使用指南:
一、管道工具基础
管道符号 |
将前一个命令的输出作为后一个命令的输入,实现流式处理。例如:
cat file.txt | grep "keyword" | awk '{print $1}' | sed 's/old/new/g'
二、核心工具用法
1. grep:文本搜索
-
基础过滤:
grep "pattern" file.txt # 查找包含pattern的行 grep -i "error" server.log # 忽略大小写 grep -v "debug" file.txt # 排除包含debug的行
-
高级技巧:
grep -r "main()" /path/ # 递归搜索目录 grep -oE "[0-9]+\.[0-9]+" data.txt # 提取IP地址(正则表达式) grep -C3 "error" log.txt # 显示匹配行及前后3行
2. sed:流式编辑
-
文本替换:
sed 's/old/new/g' file.txt # 替换所有old为new(不修改原文件) sed -i 's/old/new/g' file.txt # 直接修改文件
-
行操作:
sed '2d' file.txt # 删除第2行 sed '/^#/d' config.txt # 删除注释行 sed '1i\Header' file.txt # 在文件首行插入Header
-
模式匹配:
sed '/start/,/end/s/foo/bar/g' # 在start到end范围内替换foo为bar
3. awk:列数据处理
-
基础列操作:
awk '{print $1, $3}' data.txt # 打印第1、3列 awk -F':' '{print $2}' /etc/passwd # 指定分隔符为冒号
-
条件筛选:
awk '$3 >= 30 {print $0}' data.txt # 筛选第3列≥30的行 awk '/ERROR/ {count++} END {print count}' log.txt # 统计ERROR出现次数
-
计算与统计:
awk '{sum+=$1} END {print sum}' numbers.txt # 计算第1列总和 awk 'NR%2==1 {print $0}' file.txt # 打印奇数行
三、组合使用场景
场景1:日志分析
# 提取ERROR/WARNING行,格式化输出并添加前缀
grep -E "ERROR|WARNING" log.txt |
sed 's/\[.*\] //' | # 删除时间戳
awk '{print "Alert:", $0}'
场景2:数据清洗
# 提取时间范围日志,删除DEBUG行,并清理前两列
sed -n '/2023-01-01 00:00:00/,/2023-01-01 23:59:59/p' log.txt |
grep -v "DEBUG" |
awk '{$1=$2=""; print $0}' # 删除前两列
场景3:配置转换
# 提取config开头的键,值转大写并格式化
grep "^config" config.txt |
sed 's/\(config[^=]*\)=\(.*\)/\1=\U\2/' | # 值转大写
awk -F'=' '{print $1 " → " $2}'
场景4:网络请求分析
# 提取404错误对应的URL
grep " 404 " access.log |
sed 's/.*GET \([^ ]*\) .*/\1/' | # 提取URL
awk '{print "Failed:", $0}'
四、高级技巧
-
变量传递:
port=8080 awk -v p="$port" '{print $1 ":" p}' data.txt # 将shell变量传入awk
-
性能优化:
- 对大文件使用
grep --line-buffered
减少内存占用。 - 结合
xargs
处理海量数据:find . -name "*.log" | xargs grep "error"
- 对大文件使用
-
正则表达式:
grep -E
或sed -r
启用扩展正则(如grep -E "error|warning"
)。
五、典型应用场景
- 日志分析:过滤错误、统计频率、提取上下文。
- 数据清洗:处理CSV/TSV、转换编码、清洗脏数据。
- 配置管理:批量修改配置项、生成标准化输出。
- 自动化报表:从原始数据生成结构化统计结果。
通过灵活组合管道和这三个工具,可实现从简单过滤到复杂数据处理的全方位需求。建议从单命令入手,逐步尝试多命令串联,最终掌握自动化文本处理流程。