人人都能学编程
English 开始学习
核心 · Linux第 3 课 / 共 6 课免费阅读

管道与重定向 · Linux 与命令行

怎么把小命令组合成强大的命令?

课程目录

为什么需要它

「哪个城市用户最多?」「哪种错误最常见?」没有一条命令专门做这些,也不需要。Linux 的工具各做一件小事,再把文字传下去,所以你一分钟就能用一行命令拼出答案。

直觉理解

管道 | 把一条命令的输出接到下一条命令的输入,像传送带一样:

cut -d, -f2 data/users.csv | sort | uniq -c

取第 2 列 → 排序 → 数相邻的重复行。

重定向把输出写进文件而不是屏幕:> 覆盖文件,>> 追加到末尾。

定义

管道 Pipe

`a | b` runs a and feeds everything it prints into b. Chains can be as long as you like.
`a | b` 运行 a,并把它打印的一切喂给 b。可以接任意多节。

sort、uniq、cut

`sort` orders lines (`-n` by number, `-r` reversed, `-t, -k2` by the 2nd comma-separated field). `uniq -c` counts repeated **neighbouring** lines. `cut -d, -f2` keeps field 2.
`sort` 给行排序(`-n` 按数字,`-r` 倒序,`-t, -k2` 按逗号分隔的第 2 个字段)。`uniq -c` 统计**相邻**的重复行。`cut -d, -f2` 只保留第 2 个字段。

示例

每个城市有多少用户

在互动课里运行

用 tail -n +2(从第 2 行开始)跳过表头,再统计。

tail -n +2 data/users.csv | cut -d, -f2 | sort | uniq -c | sort -nr
逐步执行
  1. L1London 2、Shanghai 2、Berlin 1;最后一次 sort 把大的排前面。2 Shanghai

把结果存进文件

在互动课里运行

> 创建或覆盖;>> 追加。然后把文件读回来看看。

grep ERROR logs/app.log > errors.txt
grep WARN logs/app.log >> errors.txt
wc -l errors.txt
grep -c timeout errors.txt
逐步执行
  1. L1屏幕上什么都没有:三行都写进了 errors.txt。
  2. L2>> 把 WARN 那一行加在末尾。
  3. L33 + 1 = 4 行。4 errors.txt

常见错误

uniq 前面没 sort

uniq 只合并挨在一起的行。a b a 还是三行;要先 sort。

想追加却用了 >

> 会在写入前清空文件。一个手误就可能清掉你想保留的日志。

小测验

1. 这段代码会输出什么?

grep ERROR logs/app.log | cut -d' ' -f3- | sort | uniq -c | sort -nr | head -n 1
  1. A
          2 payment timeout
  2. B
          1 database connection lost
  3. C
          3 ERROR
查看答案

答案:A

cut 保留 ERROR 后面的词。payment timeout 出现两次,最多。

2. 这段代码会输出什么?

echo one > f.txt
echo two > f.txt
echo three >> f.txt
cat f.txt
  1. A
    two
    three
  2. B
    one
    two
    three
  3. C
    three
查看答案

答案:A

第二个 > 把 one 换成了 two,>> 又加上了 three。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出年纪最大的用户

    准确写出打印的内容。

  2. 改需求数出来,别列出来

    这条管道把每个城市都列出来了,包括重复的。改成每个城市只出现一次,并带上人数,人多的在前。

  3. 从零写一份错误报告

    把 logs/app.log 里包含 ERROR 的行写进 report.txt,然后再追加一行:这些行的数量(grep -c)。屏幕上什么都不打印。

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
Pipe管道| sends one command's output into the next command's input.
Redirection重定向> or >> sends output into a file instead of the screen.
CSVCSV 文件Comma-separated values: a table as plain text, one row per line.