sort / uniq / comm 文本处理速查表
sort、uniq 和 comm 是 Linux/Unix 文本处理的三大基础命令。sort 对文本行排序,uniq 去重并统计频次,comm 进行集合(交集、差集)运算。本速查表覆盖从基础到高级的所有用法。
基本排序 (Basic Sort)
sort 命令对文本行进行排序,默认按字典序。
### 基础操作
``yaml
# 按字典序排序
sort file.txt
# 按数值排序 sort -n numbers.txt
# 逆序排序 sort -r file.txt
# 数值逆序排序 sort -rn numbers.txt
# 忽略大小写排序 sort -f file.txt
# 忽略前导空白
sort -b file.txt
`
### 检查排序状态
`yaml
# 检查是否已排序(无输出表示已排序)
sort -c file.txt
# 静默检查(退出码指示状态,0=已排序)
sort -C file.txt
`
高级排序 (Advanced Sort)
### 按字段排序
`yaml
# 按第2列排序(默认 tab/空格分隔)
sort -k2 data.txt
# 按第3列数值排序 sort -k3n data.txt
# 按第2列排序,第3列数值排序 sort -k2,2 -k3n data.txt
# 指定列分隔符(冒号) sort -t: -k3n /etc/passwd
# 按数值字段排序并保持标题行
(head -1 data.txt && tail -n+2 data.txt | sort -k2n) > sorted.txt
`
### 人类可读与版本号排序
`yaml
# 人类可读数值排序(K/M/G 单位)
sort -h sizes.txt
# 版本号排序 sort -V versions.txt
# 混合排序
sort -h -k2 size_report.txt
`
### 合并与输出控制
`yaml
# 合并已排序文件
sort -m sorted1.txt sorted2.txt
# 去重排序 sort -u file.txt
# 输出到文件而非 stdout sort file.txt -o sorted.txt
# 指定缓冲区大小 sort -S 1G large.txt
# 指定临时目录 sort -T /tmp large.txt
# 随机排序
sort --random-sort file.txt
`
去重 (uniq)
uniq 命令去除/统计连续重复行(通常配合 sort 使用)。
### 基本去重
`yaml
# 去除连续重复行(通常先排序)
sort file.txt | uniq
# 去除重复(相当于 sort -u) sort -u file.txt
# 统计每行出现次数 sort file.txt | uniq -c
# 只显示重复行 sort file.txt | uniq -d
# 只显示唯一行(不重复的)
sort file.txt | uniq -u
`
### 高级去重
`yaml
# 忽略大小写
sort file.txt | uniq -i
# 比较前 N 个字符 sort file.txt | uniq -w 5
# 跳过前 N 个字符 sort data.txt | uniq -s 3
# 组合:统计且忽略大小写 sort -f file.txt | uniq -ic
# 统计并按频次降序排列
sort file.txt | uniq -c | sort -rn
`
集合运算 (Set Operations with comm)
comm 命令比较两个已排序文件的公共行。
### 交集与差集
`yaml
# 显示所有三列(file1独有 | file2独有 | 共有)
comm sorted1.txt sorted2.txt
# 交集:两文件都有的行 comm -12 file1.txt file2.txt
# file1 独有(差集) comm -23 file1.txt file2.txt
# file2 独有(差集)
comm -13 file1.txt file2.txt
`
### 集合运算组合
`yaml
# 对称差集(A∪B - A∩B)
comm -3 file1.txt file2.txt | tr -d '\t'
# 并集(所有行) cat file1.txt file2.txt | sort -u
# 检查 A 是否是 B 的子集
# 如果 A-B 为空则 A⊆B
[ -z "$(comm -23 A.txt B.txt)" ] && echo "A是B的子集"
`
管道组合 (Pipeline Patterns)
sort、uniq、comm 常与其他命令配合形成强大的文本处理管道。
### 日志分析
`yaml
# 统计 Nginx 访问 IP 及次数(降序)
awk '{print $1}' access.log | sort | uniq -c | sort -rn
# 统计 HTTP 状态码分布 awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 找出最活跃的 TOP 10 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
`
### 文件去重与排序
`yaml
# 合并多个文件并去重
cat file1.txt file2.txt file3.txt | sort -u > combined.txt
# 找出两文件相同和不同的行
sort file1.txt > a.sorted
sort file2.txt > b.sorted
comm a.sorted b.sorted
`
### 实用辅助命令
`yaml
# 随机打乱行
shuf file.txt
# 拓扑排序(主要用于依赖关系) tsort depend.txt
# 统计单词频率 tr ' ' '\n' < file.txt | sort | uniq -c | sort -rn
# 按管道统计行数 cat file.txt | sort | uniq | wc -l ``
基本排序(8)
| 命令 | 难度 | ||
|---|---|---|---|
sort file.txt按字典序升序排序 | 基础 | sort file.txt | |
sort -n numbers.txt按数值大小排序 | 基础 | sort -n numbers.txt | |
sort -r file.txt逆序(降序)排序 | 基础 | sort -r file.txt | |
sort -rn numbers.txt数值逆序排序 | 基础 | sort -rn numbers.txt | |
sort -f file.txt忽略大小写排序 | 基础 | sort -f file.txt | |
sort -b file.txt忽略前导空白字符 | 基础 | sort -b file.txt | |
sort -c file.txt检查文件是否已排序(输出错误行) | 中级 | sort -c file.txt | |
sort -C file.txt静默检查排序状态(退出码 0=已排序) | 中级 | sort -C file.txt |
高级排序(12)
| 命令 | 难度 | ||
|---|---|---|---|
sort -k2 data.txt按第 2 列排序 | 中级 | sort -k2 data.txt | |
sort -k3n data.txt按第 3 列数值排序 | 中级 | sort -k3n data.txt | |
sort -t: -k3n /etc/passwd指定冒号为分隔符,按第 3 列数值排序 | 中级 | sort -t: -k3n /etc/passwd | |
sort -k2,2 -k3n data.txt先按第 2 列排序,同值再按第 3 列数值排序 | 中级 | sort -k2,2 -k3n data.txt | |
sort -h sizes.txt人类可读数值排序(K/M/G) | 中级 | sort -h sizes.txt | |
sort -V versions.txt版本号排序 | 中级 | sort -V versions.txt | |
sort -u file.txt排序并去重 | 基础 | sort -u file.txt | |
sort -m sorted1.txt sorted2.txt合并已排序文件(不执行排序) | 高级 | sort -m sorted1.txt sorted2.txt | |
sort -S 1G large.txt指定排序缓冲区大小 | 高级 | sort -S 1G large.txt | |
sort -T /tmp large.txt指定临时文件目录 | 高级 | sort -T /tmp large.txt | |
sort -o sorted.txt file.txt排序并输出到指定文件 | 基础 | sort file.txt -o sorted.txt | |
sort --random-sort file.txt随机排序(打乱行顺序) | 中级 | sort --random-sort file.txt |
去重(6)
| 命令 | 难度 | ||
|---|---|---|---|
sort file.txt | uniq排序后去重 | 基础 | sort file.txt | uniq | |
sort file.txt | uniq -c统计每行出现次数 | 基础 | sort file.txt | uniq -c | |
sort file.txt | uniq -d只显示重复行 | 基础 | sort file.txt | uniq -d | |
sort file.txt | uniq -u只显示唯一行(不重复的) | 基础 | sort file.txt | uniq -u | |
sort -f file.txt | uniq -ic忽略大小写统计频次 | 中级 | sort -f file.txt | uniq -ic | |
sort file.txt | uniq -w 5只比较每行前 5 个字符去重 | 中级 | sort file.txt | uniq -w 5 |
集合运算(4)
| 命令 | 难度 | ||
|---|---|---|---|
comm sorted1.txt sorted2.txt三列显示:file1独有|file2独有|共有 | 基础 | comm sorted1.txt sorted2.txt | |
comm -12 file1.txt file2.txt交集(两文件都有的行) | 基础 | comm -12 file1.txt file2.txt | |
comm -23 file1.txt file2.txt差集(file1 独有行) | 基础 | comm -23 file1.txt file2.txt | |
comm -13 file1.txt file2.txt差集(file2 独有行) | 基础 | comm -13 file1.txt file2.txt |
管道组合(6)
| 命令 | 难度 | ||
|---|---|---|---|
sort file.txt | uniq -c | sort -rn统计频率并按频次降序排列 | 中级 | sort file.txt | uniq -c | sort -rn | |
awk '{print $1}' access.log | sort | uniq -c | sort -rn统计日志中 IP 访问次数并降序排列 | 中级 | awk '{print $1}' access.log | sort | uniq -c | sort -rn | |
cat file1.txt file2.txt | sort -u合并多个文件并去重(并集) | 基础 | cat file1.txt file2.txt | sort -u | |
shuf file.txt随机打乱文件行 | 基础 | shuf file.txt | |
tsort depend.txt拓扑排序(依赖关系排序) | 高级 | tsort depend.txt | |
tr ' ' '\n' < file.txt | sort | uniq -c | sort -rn统计单词频率(空格分隔转行) | 中级 | tr ' ' '\n' < file.txt | sort | uniq -c | sort -rn |