【shell】管道与过滤器详解

一、管道(Pipe)
1. 核心概念
  • 符号|
  • 功能:将前一个命令的标准输出作为后一个命令的标准输入
  • 特点
    • 单向数据流
    • 多个命令可串联形成处理链
    • 不直接修改源文件(除非配合重定向)
2. 基础用法示例
# 统计包含 "error" 的日志行数
grep "error" app.log | wc -l

# 筛选进程后排序
ps aux | grep nginx | sort -k3 -nr

二、过滤器(Filter)
1. 常见过滤器命令
命令功能典型场景
grep文本搜索grep "404" access.log
sed流编辑器(替换/删除行)sed 's/old/new/g' file
awk结构化文本处理awk '{print $1,$3}'
sort排序sort -n -k2 data.txt
uniq去重统计sort file | uniq -c
cut按列提取cut -d: -f1 /etc/passwd
tr字符替换/删除tr 'a-z' 'A-Z'
tee分流输出cmd | tee output.log
2. 组合示例
# 分析访问日志前10大IP
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
  • 步骤分解
    1. awk 提取第一列(IP地址)
    2. sort 排序准备去重
    3. uniq -c 统计出现次数
    4. sort -nr 按次数倒序
    5. head 取前10行

三、高级技巧
1. 错误流处理
# 合并标准输出与错误输出到管道
cmd 2>&1 | grep "error"
2. 并行加速
# 使用 xargs 并行处理
find . -name "*.log" | xargs -P4 -I{} gzip {}
  • -P4:启动4个并行进程
3. 中间结果调试
# 使用 tee 查看管道中间结果
cat data.csv | awk -F, '{print $2}' | tee temp.txt | sort | uniq
4. 复杂条件过滤
# 找出修改时间超过30天的大于1GB的日志文件
find /var/log -name "*.log" -mtime +30 -size +1G | xargs ls -lh

四、性能优化
1. 减少管道步骤
# 低效:多次管道调用
cat file | grep "A" | grep "B" | grep "C"

# 高效:合并正则
grep -E "A.*B.*C" file
2. 选择高效过滤器
# 文本替换场景对比
sed 's/old/new/g' file    # 适合流处理
awk '{gsub(/old/,"new"); print}' file  # 更复杂的逻辑
3. 处理大文件
# 使用高效工具
find /data -type f | parallel -j8 gzip  # 并行压缩

五、典型应用场景
1. 实时日志监控
tail -f app.log | grep --color "ERROR\|WARNING"
2. 数据清洗转换
# CSV转JSON
cat data.csv | awk -F, 'NR>1 {printf "{\"name\":\"%s\",\"age\":%d},\n", $1, $2}'
3. 系统资源分析
# 统计内存占用前5的进程
ps aux | sort -nrk4 | head -5
4. 批量文件操作
# 批量重命名图片
ls *.jpg | sed 's/^/prefix_/' | xargs -n1 -I{} mv {} prefix_{}

六、注意事项
  1. 编码一致性:管道中的命令应统一字符编码(如UTF-8)
  2. 信号传播Ctrl+C 会终止整个管道链
  3. 资源限制:长管道可能消耗较多内存和CPU
  4. 排序依赖uniq 通常需要前置 sort

通过灵活组合管道与过滤器,可以实现:
✅ 快速构建数据处理流水线
✅ 无需临时文件的复杂操作
✅ 高效的命令行自动化方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值