除了 grep、sed、awk 这“文本处理三剑客”,Linux 还提供了一组轻量级的辅助文本工具。它们各自专精于某一项操作,通过管道组合在一起时,能快速解决大量日常问题。下面介绍其中最常用、最实用的几个。
cut — 按列提取
cut 用于从文本中截取特定列或字段,非常适合处理 CSV、日志等格式规整的数据。
常用选项:
-c:按字符位置截取(如-c1-5提取每行第 1 到第 5 个字符)-d:指定分隔符(默认是制表符)-f:按字段编号提取(配合-d使用)
示例:
# 提取 /etc/passwd 中的用户名和 Shell(以冒号为分隔符)
cut -d: -f1,7 /etc/passwd
# 提取每行的第 1 到第 10 个字符
cut -c1-10 access.log
sort — 排序
sort 将文本行按指定规则重新排列。它常与 uniq 配合使用。
常用选项:
-n:按数值排序(否则默认按字符串字典序)-r:逆序排列-k:指定排序的列(例如-k2按第 2 列排序)-t:指定字段分隔符
示例:
# 按数值从大到小排序
sort -nr numbers.txt
# 按 CSV 文件的第 3 列排序
sort -t, -k3 data.csv
uniq — 去重与计数
uniq 用于处理连续重复的行,通常需要先用 sort 将相同行排到一起。
常用选项:
-c:在每行前显示出现的次数-d:仅显示重复的行-u:仅显示不重复的行
示例:
# 统计每个 IP 在日志中出现的次数(先排序,再统计)
awk '{print $1}' access.log | sort | uniq -c | sort -rn
# 仅列出重复的行
sort file.txt | uniq -d
tr — 字符转换与删除
tr 用于对标准输入中的字符进行一对一替换、删除或压缩,不能直接处理文件,必须结合重定向或管道。
常用选项:
-d:删除指定字符-s:压缩连续重复的字符tr SET1 SET2:将 SET1 中的字符替换为 SET2 中对应位置的字符
示例:
# 将文本中的大写字母全部转为小写
cat file.txt | tr 'A-Z' 'a-z'
# 删除所有回车符(将多行合并成一行)
tr -d '\n' < file.txt
# 压缩连续的空格为一个空格
echo "this has spaces" | tr -s ' '
paste — 按列合并
paste 将多个文件的行横向拼接在一起,默认使用制表符分隔,可以用 -d 指定分隔符。
示例:
# 将两个文件逐行合并,用冒号分隔
paste -d: names.txt phones.txt
这个工具在需要并排比较两个列表,或为数据添加列时非常方便。
join — 关系型连接
join 类似于数据库中的连接操作,可以根据一个共同字段将两个文件的行合并。要求输入文件已根据该字段排好序。
常用选项:
-1 N:指定第 1 个文件的连接字段是第 N 列-2 N:指定第 2 个文件的连接字段是第 N 列-t:指定字段分隔符
示例:
# 根据第 1 列连接两个文件,默认以空白分隔,输出匹配的行
join -1 1 -2 1 file1.txt file2.txt
tee — 分流输出
tee 不是纯文本处理工具,但在处理文本流的管道中非常实用。它从标准输入读取数据,同时输出到标准输出和指定文件,就像管道的“T 型接头”。
示例:
# 将处理结果同时保存到文件并显示在屏幕上
grep 'ERROR' app.log | tee errors.txt | wc -l
xargs — 将标准输入转为命令行参数
很多命令(如 rm、cp)不接受管道直接传入文件名,xargs 可以把前一条命令的输出作为参数传递给后续命令。
示例:
# 删除当前目录下所有 .tmp 文件
find . -name "*.tmp" | xargs rm
# 与 -I 配合,可以控制参数位置
cat filelist.txt | xargs -I {} cp {} /backup/
实用组合思路
这些工具本身都很简单,但在实际工作中,它们常常被串联成一条流水线。比如,要找出某个日志文件中出现频率最高的 5 个状态码并输出为 CSV 格式,可以这样组合:
awk '{print $9}' access.log | sort | uniq -c | sort -rn | head -5 | tr -s ' ' ',' > top5.csv
这条命令依次完成列提取、排序、统计、逆序排列、取前 5、格式化输出,全程无需任何复杂的脚本语言,充分体现了 Linux “小而精” 的工具哲学。