管道与重定向 · 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逐步执行
- 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逐步执行
- L1屏幕上什么都没有:三行都写进了 errors.txt。
- L2>> 把 WARN 那一行加在末尾。
- 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查看答案
答案:A
cut 保留 ERROR 后面的词。payment timeout 出现两次,最多。
2. 这段代码会输出什么?
echo one > f.txt
echo two > f.txt
echo three >> f.txt
cat f.txt查看答案
答案:A
第二个 > 把 one 换成了 two,>> 又加上了 three。
动手练习
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. |
| CSV | CSV 文件 | Comma-separated values: a table as plain text, one row per line. |