// Linux · 2025-04-24

Linux 命令行冷门实用小工具:提升效率的隐藏利器(nl、column、shuf、jq、fmt 和 rev)

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