讲解

每个命令都有三个标准流:标准输入 stdin(默认来自键盘)、标准输出 stdout(默认显示到屏幕)、标准错误 stderr(也默认显示到屏幕)。管道符 | 把左边命令的 stdout 接到右边命令的 stdin,于是小命令可以像乐高一样拼出复杂功能:grep "ERROR" app.log | wc -l 统计报错行数——这正是 Unix「小工具组合」哲学的体现。

重定向改变流的去向:> 文件 把 stdout 写进文件(覆盖原有内容),>> 文件 是追加;2> 文件 重定向 stderr;2>&1 把 stderr 并入 stdout 的当前去向。> /dev/null 把输出丢进「黑洞」设备,彻底丢弃。一个经典顺序陷阱:command > out.log 2>&1 能把两类输出都收进文件,而写成 2>&1 > out.log 则不行——重定向是从左到右依次生效的。

再来一个被低估的工具 tee:命令 | tee 文件 会同时把内容写到文件和 stdout,适合「既想存下来又想实时看」的场景。组合技的经典形态是 grep ... | sort | uniq -c | sort -rn | head:筛选、排序、统计次数、按次数倒序、取前几条——分析日志的五连鞭。

示例

# 管道串联:筛出报错行,数有多少行
grep "ERROR" app.log | wc -l

# 日志五连鞭:取日志级别列,统计每种级别出现次数
cat app.log | awk '{print $3}' | sort | uniq -c | sort -rn
# > 覆盖写入,>> 追加
echo "==== 新的分割线 ====" > divider.txt
echo "补充的一行" >> notes.txt
cat divider.txt notes.txt

# 把错误信息存进文件,屏幕上看不到错误
ls 不存在的目录 2> error.log || echo "命令失败了"
cat error.log

# 输出丢进黑洞
echo "这行你看不到" > /dev/null

常见坑

  • > 与 >> 用反:> 会清空文件再写入,手滑一次日志就没了。想追加务必 >>。
  • 2>&1 写错顺序:cmd 2>&1 > file 只重定向了 stdout,错误照样刷屏。正确是 cmd > file 2>&1。
  • 管道只传 stdout:stderr 不走管道,cmd | grep error 抓不到错误输出,要先 2>&1 合并。
  • 边读边写同一个文件:grep x file.txt > file.txt 会先把 file.txt 清空再 grep,得到空文件。先输出到临时文件再 mv 回来。

小结

| 连接命令,> 覆盖写、>> 追加写、2> 收错误、2>&1 合流、/dev/null 丢弃;tee 一鱼两吃。管道组合是命令行威力的放大器。下一节进入权限系统:chmod。