| 管道 · 命令流水线

上游:ls· cat· grep(先会单个命令,再学怎么把它们串起来) 下游:grep(管道最常见的搭档)· shell-script(脚本大量使用管道) 参见:find(find 的输出经常接管道)


一句话是什么

|(竖线,念 “pipe”)把前一个命令的输出直接送给下一个命令的输入—— 就像工厂的流水线,上一道工序的产品直接进下一道。


为什么需要它

没有管道,你需要这样:

ls -la ~/mc-server/ > /tmp/输出.txt    # 把输出存到文件
grep "sh" /tmp/输出.txt               # 再搜索
rm /tmp/输出.txt                       # 删临时文件

有了管道,一行搞定:

ls -la ~/mc-server/ | grep "sh"

管道 = 跳过中间文件,命令直接对话。

ls -la ~/mc-server/
    │
    │  (输出给管道)
    ↓
grep "sh"
    │
    ↓
  只显示含 "sh" 的行


核心用法

公式

命令A | 命令B | 命令C | ...

可以串联任意多个命令,左边的输出流向右边的输入。

常用管道组合

组合命令说明
过滤输出命令 | grep "词"只看含关键词的行
分页显示命令 | less长输出分页翻看(q 退出)
只看前N行命令 | head -20只显示前 20 行
只看后N行命令 | tail -20只显示后 20 行
统计行数命令 | wc -l输出有多少行
去重命令 | sort | uniq排序后去重
统计个数命令 | sort | uniq -c | sort -rn统计每种出现次数

几个必会的搭档命令

命令功能
head -N只显示前 N 行
tail -N只显示后 N 行
wc -l计数(多少行)
sort排序
uniq去重(需要先 sort)
less分页(按空格翻页,q 退出)

Linux 笑话

Aaron 第一次运行 apt list --installed,终端疯狂滚屏, 滚了好几秒,他根本没看清有什么。

爸爸说:加管道。

apt list --installed 2>/dev/null | wc -l

输出:347

Aaron:“装了 347 个软件包?!我只装了 tree 和 htop 啊!”

爸爸说:“其他 345 个是 Ubuntu 系统自带的,你装系统时一起来的。”

Aaron:“那我的电脑是不是很重?”

爸爸没有回答,默默地继续工作。

du -sh /
# 15G    /

15GB。Aaron 发现他笔记本装的东西比他以为的多得多。


例题精讲

📗 初探 Starter — 过滤长输出

任务:找到系统里所有以 “python” 开头的已安装包。

# 不用管道(很难看)
apt list --installed 2>/dev/null
 
# 用管道过滤
apt list --installed 2>/dev/null | grep "^python"
 
# 统计有多少个 python 相关包
apt list --installed 2>/dev/null | grep "python" | wc -l

2>/dev/null 是什么?

  • 2> = 把错误输出(stderr)重定向
  • /dev/null = Linux 的”黑洞”,输入什么都消失(不是硬盘上的文件,是一个特殊设备)
  • 用人话:把报错的废话扔进黑洞,只看干净的输出
  • 极客写法:command 2>/dev/null 或者更狠的 command &>/dev/null(连正常输出也一起扔)

你学到了什么| grep 过滤,| wc -l 计数,这两个是最常见的管道用法。


📘 应用 User — 实时跟踪日志

任务:Minecraft 服务器运行时,实时查看新日志,并只显示错误信息。

# tail -f = follow,实时追踪文件末尾(新内容自动显示)
tail -f ~/mc-server/logs/latest.log
 
# 加管道过滤,只显示 ERROR 行
tail -f ~/mc-server/logs/latest.log | grep -i "error"
 
# 按 Ctrl+C 停止追踪

tail -f 的用处

  • -f = follow(跟随),文件有新内容就立刻显示
  • 服务器管理员几乎每天都用这个方法实时监控日志
  • 加上 | grep error 就只看错误,忽略正常运行信息

你学到了什么tail -f | grep 是服务器运维的日常操作。


📙 管理 Admin — 分析日志统计错误频率

任务:统计服务器日志里每种错误出现了多少次,找出最常见的问题。

# 提取所有 ERROR 行
grep -i "error" ~/mc-server/logs/latest.log > /tmp/errors.txt
 
# 或者用管道直接处理(不存临时文件)
grep -i "error" ~/mc-server/logs/latest.log \
    | sort \
    | uniq -c \
    | sort -rn \
    | head -10

逐步分解这条管道

grep -i "error" 日志文件      # 找出所有错误行
    | sort                   # 把相同的行排在一起
    | uniq -c                # 统计每种行出现多少次(-c = count)
    | sort -rn               # 按数字从大到小排序(-r = reverse, -n = numeric)
    | head -10               # 只显示前 10 名(最常见的错误)

输出大概是:

     45 [ERROR] Failed to authenticate player
     12 [ERROR] Connection timeout
      3 [ERROR] Failed to load chunk

你学到了什么:管道可以串 4-5 个命令组成一条”数据流水线”, 每个命令只做一件简单的事,组合起来完成复杂分析。


官方文档参考

管道 | 是 shell 内建机制,不是独立程序,无 man page。 相关阅读:man bash(搜索 Pipelines)或 info bash

Unix 哲学出处:Doug McIlroy,1978 年,Bell Labs Technical Journal。


节点链接

上游(单个命令要先会,才能串管道)

  • ls ← ls | grep 找特定文件
  • cat ← cat | grep 搜文件内容
  • grep ← grep 是管道最常见的搭档
  • find ← find | grep 或 find -exec

同层(常见管道搭档命令)

  • grep ← 过滤 head / tail ← 截取 sort / uniq ← 排序去重 wc ← 计数

下游(管道是这些技能的基础)

实战


节点版本:v1.0 · 2026-04-20 下一个节点建议:wgetshell-script