在 Linux 日常工作中,sort、uniq、wc、cut、tr 这几个命令是文本处理工具箱中最常用、最基础的一批成员。它们都严格遵循“一个程序做好一件事”的哲学,通过管道组合可以轻松应对日志分析、数据清洗、格式转换等大量实际任务。
1. sort —— 排序
sort 对文本文件或标准输入的内容按行进行排序,默认按字母顺序升序排列。
常用选项
-n:按数值大小排序(而非字符串顺序),例如 2 会排在 10 前面。-r:逆序(降序)排列。-k:指定按哪一列排序(列从 1 开始计数)。-t:指定字段分隔符,默认为空白字符。常配合-k使用。-u:排序的同时去除重复行(相当于sort | uniq,但通常更高效)。
实用示例
# 对文件内容数字升序排序
sort -n numbers.txt
# 按 CSV 文件的第三列降序排序
sort -t ',' -k3 -r data.csv
# 找出访问日志中出现最多的前 5 个 IP
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head -5
这里外层 sort -rn 利用 -r 逆序和 -n 按计数值排序,快速得到前几名。
2. uniq —— 去重
uniq 用于移除或统计连续重复的行。默认只考虑相邻行是否相同,因此常与 sort 配合使用来对整个文件进行全局去重。
常用选项
-c:在每一行前加上它在输入中连续出现的次数。-d:只输出重复出现的行。-u:只输出不重复的行。
实用示例
# 统计日志中每个 IP 出现的次数(假设日志已排序)
sort access.log | uniq -c | sort -rn
# 找出文件中重复的行内容
sort file.txt | uniq -d
# 去除重复行并保存到新文件
sort old.txt | uniq > new.txt
注意:如果只是单纯想去掉文件中所有重复行,使用 sort -u 通常比 sort | uniq 更简洁。
3. wc —— 统计
wc(word count)统计文件或输入流中的行数、单词数和字节数(或字符数)。
常用选项
-l:只输出行数。-w:只输出单词数。-c:只输出字节数。-m:只输出字符数(处理多字节字符时与-c不同)。
实用示例
# 查看一个日志文件有多少行(常用来快速判断记录量级)
wc -l access.log
# 统计当前目录下 .conf 文件的总行数
cat *.conf | wc -l
# 结合其他命令统计进程数
ps aux | wc -l
4. cut —— 截取
cut 从每一行中提取指定的字段或字符范围,适用于处理结构化的文本(如 CSV、固定宽度日志等)。
常用选项
-d:指定字段分隔符,默认为制表符。-f:选取用分隔符划分出的字段,字段从 1 开始编号。可用逗号分隔多个字段(如-f1,3)或范围(如-f2-5)。-c:按字符位置截取,例如-c1-10取每行的第 1 到第 10 个字符。--complement:取补集,输出除选中字段外的所有字段。
实用示例
# 提取 /etc/passwd 中的用户名(第一个冒号分隔字段)
cut -d':' -f1 /etc/passwd
# 从 Nginx 日志中提取请求方法和路径(假设为空格分隔的第 6、7 字段)
cut -d' ' -f6,7 access.log
# 提取每行的前 20 个字符
cut -c1-20 file.txt
5. tr —— 替换或删除字符
tr 直接从标准输入读取字符,将一种字符集合替换为另一种,或直接删除某些字符。它不能直接操作文件,需要使用输入重定向或管道。
常用模式
tr SET1 SET2:将 SET1 中的每个字符替换为 SET2 中对应位置的字符。-d SET:删除输入中出现在 SET 里的每个字符。-s SET:将 SET 中连续重复的字符压缩为一个(squeeze)。- 可以使用字符类,如
[:lower:]、[:upper:]、[:digit:]、[:space:]等。
实用示例
# 将文件内容全部转为大写
cat file.txt | tr '[:lower:]' '[:upper:]'
# 删除 Windows 文本文件的行尾的 '\r' 字符(去除 ^M)
cat file.txt | tr -d '\r' > unix_format.txt
# 将多个连续空格压缩为一个空格
echo "hello world" | tr -s ' '
# 替换特定字符:将制表符转换为空格(虽然可能要用 expand,但 tr 也可行)
cat file.tsv | tr '\t' ' '
典型组合
# 统计日志中访问最多的5个URL路径(假设路径在日志第7字段)
cut -d' ' -f7 access.log | sort | uniq -c | sort -rn | head -5
# 这里 cut 提取字段,sort 排序,uniq -c 计数,再 sort -rn 按次数倒排,head 截取前5
这一组小工具看似功能单一,但学会灵活组合它们,就能在不借助 Python 或庞大分析软件的情况下,完成绝大多数日常文本处理任务。它们践行了“小而精”的 Linux 命令行哲学,值得牢牢掌握。