Linux 的命令行世界充满了惊喜。除了广为人知的工具外,还有许多鲜为人知的小命令,它们功能独特,能在特定场景下显著提升工作效率。本文将介绍六个冷门但实用的 Linux 工具:nl、column、shuf、jq、fmt 和 rev,带你领略它们在文本处理中的妙用。
如果你对更多文本处理命令感兴趣,不妨参考我之前的文章:效率提升 200%!6 个 Linux 文本处理命令详解(paste、xargs、pr、join、tr、fold)。
1. nl:为文本行添加编号
1.1 命令简介
nl(number lines)是一个为文本行添加行号的实用工具,适合整理文档、调试输出或生成编号列表。
1.2 基本语法
nl [选项] [文件]
1.3 常用选项
-b TYPE:指定编号样式(a所有行,t仅非空行,n不编号)。-n FORMAT:设置编号格式(ln左对齐,rn右对齐,rz右对齐补零)。-w WIDTH:定义编号宽度。-s SEP:设置编号与文本的分隔符。-v NUM:指定起始编号。--help:查看帮助信息。
1.4 基础示例
file.txt:
apple
banana
cherry
示例 1:默认编号
nl file.txt
输出:
1 apple
2 banana
3 cherry
解析:空行默认不编号,编号右对齐。
示例 2:仅编号非空行
nl -b t file.txt
输出:
1 apple
2 banana
3 cherry
示例 3:自定义编号格式
nl -n rz -w 3 -s ": " file.txt
输出:
001: apple
002: banana
003: cherry
1.5 进阶用法
示例 4:从指定数字开始
nl -v 100 file.txt
输出:
100 apple
101 banana
102 cherry
示例 5:为脚本编号
script.sh:
#!/bin/bash
echo "Starting"
sleep 1
echo "Processing"
nl -s " | " script.sh
输出:
1 | #!/bin/bash
2 | echo "Starting"
3 | sleep 1
4 | echo "Processing"
示例 6:结合 tail 查看日志
tail -n 5 /var/log/syslog | nl
输出:为系统日志最后五行添加编号。
1.6 实际应用场景
- 文档整理:为教程或报告添加行号,便于引用。
- 代码审查:标记脚本行以便讨论。
- 日志分析:快速定位多行日志中的关键信息。
2. column:美化文本列排版
2.1 命令简介
column 能将杂乱的文本整理为整齐的列式输出,大幅提升可读性,非常适合格式化表格或列表数据。
2.2 基本语法
column [选项] [文件]
2.3 常用选项
-t:自动生成表格。-s DELIM:指定分隔符。-c WIDTH:设置输出宽度。-x:按行填充列。-o SEP:自定义列间分隔符。--help:查看帮助信息。
2.4 基础示例
data.txt:
name age city
Alice 25 NewYork
Bob 30 London
示例 1:基本表格化
column -t data.txt
输出:
name age city
Alice 25 NewYork
Bob 30 London
示例 2:处理 CSV 文件
data.csv:
name,age,city
Alice,25,NewYork
Bob,30,London
column -t -s ',' data.csv
输出:
name age city
Alice 25 NewYork
Bob 30 London
示例 3:限制输出宽度
column -t -c 20 data.txt
输出:
name age city
Alice 25 NewYork
Bob 30 London
2.5 进阶用法
示例 4:格式化命令输出
df -h | column -t
输出:将磁盘使用情况整理为整齐表格。
示例 5:自定义列分隔符
column -t -s ',' -o ' | ' data.csv
输出:
name | age | city
Alice | 25 | NewYork
Bob | 30 | London
示例 6:多列排列文件列表
ls -1 | column -c 80
输出:将文件列表按列排列,适应 80 字符宽度。
2.6 实际应用场景
- 数据预览:美化 CSV 或 TSV 文件内容。
- 系统监控:整理
ps或df的输出结果。 - 报告生成:快速创建整齐的表格展示。
3. shuf:随机打乱文本
3.1 命令简介
shuf(shuffle)用于随机打乱文本行或生成随机数序列,非常适合数据抽样、测试或随机选择。
3.2 基本语法
shuf [选项] [文件]
3.3 常用选项
-n NUM:输出指定行数。-i LO-HI:生成指定范围的随机整数。-r:允许重复抽样。-o FILE:将结果输出到文件。-z:以空字符分隔行。--help:查看帮助信息。
3.4 基础示例
list.txt:
apple
banana
cherry
示例 1:随机打乱
shuf list.txt
输出(可能结果):
cherry
apple
banana
示例 2:取前 N 行
shuf -n 2 list.txt
输出(可能结果):
banana
apple
示例 3:生成随机数
shuf -i 1-10 -n 3
输出(可能结果):
7
2
9
3.5 进阶用法
示例 4:重复抽样
shuf -r -n 5 list.txt
输出(可能结果):
apple
banana
apple
cherry
banana
示例 5:随机选择文件
ls *.txt | shuf -n 1
输出:随机返回一个 .txt 文件名。
示例 6:保存随机结果
shuf -i 1-100 -n 10 -o random.txt
生成 10 个随机数并保存到 random.txt。
3.6 实际应用场景
- 测试数据:生成随机样本验证程序。
- 抽奖工具:从名单中随机挑选。
- 学习辅助:打乱练习题顺序以增加挑战性。
4. jq:强大的 JSON 处理工具
4.1 命令简介
jq 是一个功能强大的命令行 JSON 处理工具,可用于解析、过滤、转换和生成 JSON 数据。尽管不如 cat 或 grep 那样广为人知,但它在处理结构化数据时极为高效。
4.2 基本语法
jq [选项] '过滤表达式' [文件]
4.3 常用选项
-r:输出原始字符串(无引号)。-c:紧凑输出(单行)。-M:美化输出。-s:将多个输入合并为数组。--help:查看帮助信息。
4.4 基础示例
data.json:
{"name": "Alice", "age": 25, "city": "NewYork"}
示例 1:提取字段
jq '.name' data.json
输出:
"Alice"
示例 2:输出原始字符串
jq -r '.name' data.json
输出:
Alice
示例 3:处理数组
array.json:
[1, 2, 3]
jq '.[]' array.json
输出:
1
2
3
4.5 进阶用法
示例 4:过滤数据
users.json:
[{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
jq '.[] | select(.age > 25)' users.json
输出:
{
"name": "Bob",
"age": 30
}
示例 5:转换数据
jq '[.[] | .age * 2]' array.json
输出:
[2, 4, 6]
示例 6:从命令输出提取
curl -s 'https://api.example.com/data' | jq '.result'
输出:从 API 返回的 JSON 中提取 result 字段。
4.6 实际应用场景
- API 数据处理:解析和提取 JSON 响应。
- 配置文件管理:快速查看或修改 JSON 配置。
- 数据分析:过滤和转换结构化数据。
5. fmt:优化文本格式
5.1 命令简介
fmt(format)用于重新格式化文本,调整行宽或优化段落,适用于文档排版或处理长行文本。
5.2 基本语法
fmt [选项] [文件]
5.3 常用选项
-w WIDTH:设置最大行宽。-s:仅拆分长行,不合并短行。-u:统一单词间距。-p PREFIX:仅格式化带指定前缀的行。--help:查看帮助信息。
5.4 基础示例
text.txt:
This is a very long line that needs formatting to improve readability and structure.
示例 1:默认格式化
fmt text.txt
输出(默认 75 字符宽):
This is a very long line that needs formatting to improve
readability and structure.
示例 2:指定行宽
fmt -w 30 text.txt
输出:
This is a very long line that
needs formatting to improve
readability and structure.
示例 3:统一间距
echo "This is spaced" | fmt -u
输出:
This is spaced
5.5 进阶用法
示例 4:仅拆分长行
fmt -s -w 20 text.txt
输出:
This is a very long
line that needs
formatting to
improve readability
and structure.
示例 5:格式化代码注释
code.c:
// This is a very long comment that needs to be wrapped properly for clarity.
fmt -w 40 -p "//" code.c
输出:
// This is a very long comment that
// needs to be wrapped properly for
// clarity.
示例 6:批量格式化
fmt -w 80 *.txt > formatted.txt
5.6 实际应用场景
- 文档调整:优化纯文本或 Markdown 文件。
- 邮件撰写:格式化文本适配邮件客户端。
- 代码美化:整理冗长注释或说明。
6. rev:反转字符顺序
6.1 命令简介
rev(reverse)将每行文本的字符顺序反转,简单而实用,可用于数据转换或趣味操作。
6.2 基本语法
rev [文件]
6.3 常用选项
功能单一,无复杂选项。
--help:查看帮助信息。
6.4 基础示例
words.txt:
hello
world
示例 1:基本反转
rev words.txt
输出:
olleh
dlrow
示例 2:管道输入
echo "Linux" | rev
输出:
xuniL
示例 3:保存反转结果
rev < words.txt > reversed.txt
6.5 进阶用法
示例 4:结合 cut
echo "name:Alice" | cut -d':' -f2 | rev
输出:
ecilA
示例 5:双重反转
echo "hello" | rev | rev
输出:
hello
解析:验证反转的可逆性。
示例 6:反转文件名
ls -1 *.txt | rev
输出:将文件名字符反转显示。
6.6 实际应用场景
- 数据编码:通过反转字段生成简单编码。
- 教学展示:演示字符操作的原理。
- 文本游戏:创建趣味反转效果。
结语
Linux 命令行工具箱的丰富性远超想象。这些冷门小工具——nl、column、shuf、jq、fmt 和 rev——虽然不常被提及,却能在特定场景中发挥巨大作用。从为文本添加编号到解析 JSON 数据,从随机打乱顺序到格式优化,它们为日常工作提供了灵活而高效的解决方案。将这些工具融入你的工作流,结合管道和其他命令,你会发现命令行的潜力无穷无尽。探索永不止步,下次面对棘手任务时,不妨试试这些隐藏的利器,或许会带来意想不到的惊喜!
原文 https://blog.csdn.net/2301_79518550/article/details/146541048