cut -d: -f1 /etc/passwd-d 指定分隔符,-f 指定第几列,按固定分隔符截取。
约 1133 字大约 4 分钟
2026-05-14
这四个命令是文本统计的“基础四件套”:cut 取列、sort 排序、uniq 去重、wc 计数。它们单独看都很简单,但组合起来——尤其是 sort | uniq -c——能把一份杂乱的日志或清单瞬间变成一张排行榜。这篇重点讲清它们之间的配合关系。
掌握 cut 取列、sort 排序、uniq 去重、wc 计数,重点理解 uniq 为什么必须配合 sort。
cut -d: -f1 /etc/passwd-d 指定分隔符,-f 指定第几列,按固定分隔符截取。
sort -rn file-n 按数值、-r 倒序,统计排行榜常用这两个。
sort file | uniq -cuniq -c 在每行前标出它出现的次数,必须先 sort。
wc -l file-l 数行、-w 数词、-c 数字节,最常用 -l。
cut 是“取某一列”的轻量工具。两个核心选项:-d 指定分隔符,-f 指定取第几列。
cut -d: -f1 /etc/passwd # 用 : 分隔,取第 1 列(用户名)
cut -d: -f1,3 /etc/passwd # 取第 1 和第 3 列
cut -d, -f2 data.csv # 取 CSV 的第 2 列cut 的局限:它只认单个固定字符做分隔符。如果列之间是“不定数量的空格”(像 ps、df 的输出),cut 就力不从心,得用 awk(见 文本处理工具总览)。
这是新手最常踩的坑。uniq 只去除相邻的重复行——它不会全局扫描,只比较“这一行和上一行一样不一样”。
# 文件内容:a / b / a
uniq file # 输出 a b a —— 两个 a 不相邻,没被去掉!
sort file | uniq # 输出 a b —— 先排序让相同的挨在一起所以 uniq 几乎永远跟在 sort 后面。记住这条,就理解了为什么统计命令总是 sort | uniq 成对出现。
uniq -c 会在每行前面标出它出现的次数。配合 sort,就是一条万能统计句式:
sort access.log | uniq -c | sort -rn | head
# ① 排序让相同行相邻
# ② uniq -c 数每种出现几次
# ③ sort -rn 按次数从多到少排
# ④ head 看 Top 10把 access.log 换成 awk '{print $1}' access.log,就是“访问量最高的 IP 排行榜”。这个套路在 日志统计实战 里是绝对主力。
| 选项 | 作用 | 不加的后果 |
|---|---|---|
-n | 按数值排序 | 默认按字典序,10 会排在 9 前面 |
-r | 倒序(从大到小) | 默认从小到大 |
-k | 指定按第几列排 | 默认按整行 |
“为什么 100 排在 99 前面”——因为没加 -n,字典序里 1 比 9 小。统计排行榜一律 sort -rn。
wc -l 数行数最常用,但它还能数词(-w)和字节(-c)。一个实用搭配是和 grep 连用做“计数”:
grep -c "ERROR" app.log # grep 自带 -c,直接数匹配行数
grep "ERROR" app.log | wc -l # 等价写法
ls /etc | wc -l # 数 /etc 下有多少条目| 误区 | 更稳妥的做法 |
|---|---|
uniq 直接用,不先 sort | uniq 只看相邻行,必须先 sort 再 uniq,否则漏去重 |
sort 数字列没加 -n | 数值排序一律 -n,否则 10 排在 9 前面 |
列是不定空格分隔还硬用 cut | cut 只认单字符分隔符,不定空格用 awk |
| 想数数量绕一大圈 | grep -c、wc -l 直接计数,别多此一举 |
版权归属:Shuo Liu