rev 命令详解与参数实测(Ubuntu 22.04)

rev 命令逐参数实测:每行字符反转、回文检测、管道组合提取路径末段与中文 locale 差异,全部回显在 Ubuntu 22.04(util-linux 2.37.2)实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行文本处理2026/10/15

rev 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 rev 的逐行字符反转能力——默认行为、回文检测、管道组合(提取路径末段、与 tr/sed 衔接)以及多字节中文在 locale 下的成败差异,全部命令与回显已在 Ubuntu 22.04(util-linux 2.37.2)实测通过。

一、环境信息

本节记录实测环境与测试数据,便于读者按相同条件复现本文全部命令与回显。

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • rev 版本:util-linux 2.37.2(rev --version 实测)
  • 默认 locale:LANG 未设置(等效 C locale),多字节演示显式指定 C.UTF-8
  • 实测工作目录:/root/demo/rev/
  • 测试数据:lines.txt(3 行英文短句)、words.txt(5 个单词,含 3 个回文词)、paths.txt(3 行文件路径)

二、命令概览

2.1 语法与测试数据准备

rev 的基本语法为 rev [options] [file ...]:把每个 FILE(或标准输入)的每一行字符反转后输出,行与行之间的顺序不变。与 tr 不同,rev 接受文件参数。测试前先准备一套演示文件,后续所有参数实测都基于这套数据:

mkdir -p /root/demo/rev

cat > /root/demo/rev/lines.txt <<'EOF'
hello world
linux is fun
abc 123
EOF

cat > /root/demo/rev/words.txt <<'EOF'
level
linux
noon
ubuntu
madam
EOF

cat > /root/demo/rev/paths.txt <<'EOF'
/var/log/syslog
/etc/nginx/nginx.conf
/home/ubuntu/notes.txt
EOF

验证数据就绪:

$ ls -l /root/demo/rev
total 12
-rw-r--r-- 1 root root 33 Oct 15 07:40 lines.txt
-rw-r--r-- 1 root root 61 Oct 15 07:40 paths.txt
-rw-r--r-- 1 root root 30 Oct 15 07:40 words.txt

$ cat /root/demo/rev/lines.txt
hello world
linux is fun
abc 123

💡 说明:words.txt 特意选了 level、noon、madam 三个回文词与 linux、ubuntu 两个非回文词,3.2 节用它们实测回文判定。

2.2 --help 全量回显

rev 的帮助非常短——它几乎没有工作参数(实测原样保留):

Usage: rev [options] [file ...]

Reverse lines characterwise.

Options:
 -h, --help     display this help
 -V, --version  display version

For more details see rev(1).

💡 说明:帮助一句话点明语义——「Reverse lines characterwise」(按字符反转每一行)。rev 没有类似 -d/-s 的工作选项,所有扩展能力都靠与管道中其他命令组合实现。

2.3 版本确认

$ rev --version
rev from util-linux 2.37.2

三、参数逐项实测

rev 参数极少,本章按「默认行为、回文检测、管道组合、多字节行为」四个维度实测。

3.1 默认:每行字符反转

对单个字符串(stdin 输入):

$ echo 'hello world' | rev
dlrow olleh

对整个文件逐行反转(行序保持不变):

$ rev /root/demo/rev/lines.txt
dlrow olleh
nuf si xunil
321 cba

三行分别反转:linux is fun 变 nuf si xunil、abc 123 变 321 cba,空格等字符也在反转范围内,行与行的先后顺序不变。

💡 技术拓展:都叫「反转」,不同工具的作用维度不同,横向对比——

工具反转维度效果
rev每行内部的字符顺序行序不变、行内字符倒序(本文主角)
tac文件的行顺序行倒序输出、每行内容不变
sort -r按键排序后倒序依排序键从大到小,非原文顺序
sed 'y/…/…/'行内字符逐一映射可做 tr 式字符映射,写法较繁琐

想倒着看日志用 tac,想反转字符串本身用 rev;两者更细的差别见五、Q1。

3.2 回文检测

回文判定就是「反转后与自己相等」。level 反转还是 level:

$ echo 'level' | rev
level

linux 反转成 xunil:

$ echo 'linux' | rev
xunil

把「反转后比较」写成一行 shell 判断,正着反着相等的即回文:

$ word=noon; [ "$word" = "$(echo $word | rev)" ] && echo "$word 是回文"
noon 是回文

$ word=linux; [ "$word" = "$(echo $word | rev)" ] && echo "$word 是回文" || echo "$word 不是回文"
linux 不是回文

对 words.txt 整体反转,回文词原样、非回文词变形,一眼可辨:

$ rev /root/demo/rev/words.txt
level
xunil
noon
utnubu
madam

level、noon、madam 反转后与原文相同(回文),linux 变 xunil、ubuntu 变 utnubu。

💡 提示:"$(echo $word | rev)" 是命令替换的标准写法——先反转再比较;批量判定可配合 while read 逐行读入,也可直接目检 rev 文件 的输出。

3.3 管道组合:反转—截取—再反转

rev 最实用的场景是「反转后用按位置的工具取行尾内容,再反转回来」。提取路径的文件名部分:

$ rev /root/demo/rev/paths.txt | cut -d/ -f1 | rev
syslog
nginx.conf
notes.txt

原理分三步:第一步 rev 让「行尾内容」跑到行首;第二步 cut -d/ -f1 取第一个斜杠前的内容,恰好是原行的最后一段;第三步再 rev 恢复正常顺序。相比 basename 一次只能处理一个路径,这个管线可以批量处理列表,且不依赖文件真实存在。

反转结果可以继续交给其他命令加工:

$ echo 'abc def' | rev | tr 'a-z' 'A-Z'
FED CBA

3.4 多字节中文:locale 决定成败

rev 按字符反转,而「什么是字符」由 locale 决定。默认 C locale 下反转 UTF-8 中文直接报错(stderr 报非法多字节序列,退出码 1):

$ echo '你好世界' | rev | od -An -tx1
rev: stdin: 0: Invalid or incomplete multibyte or wide character

显式指定 C.UTF-8 后按汉字整字反转,结果正确:

$ LANG=C.UTF-8 bash -c "echo '你好世界' | rev"
界世好你

反转两次可无损还原,证明是按字符(而非字节)操作:

$ LANG=C.UTF-8 bash -c "echo '你好世界' | rev | rev"
你好世界

💡 提示:util-linux 2.37.2 的 rev 是宽字符实现——C locale 只认单字节字符,UTF-8 中文字节流无法解码即报错;换 UTF-8 locale(如 C.UTF-8)即可正常处理中文。其他 util-linux 工具遇到类似报错时,优先检查 locale。

四、实战示例

前面各节覆盖了默认行为与关键场景,本节给三个可直接套用的组合。

1. 批量提取路径中的文件名——反转、截取、还原三步走:

$ rev /root/demo/rev/paths.txt | cut -d/ -f1 | rev
syslog
nginx.conf
notes.txt

2. 管道二段加工——反转结果接 tr 转大写,演示 rev 作为中间环节的衔接能力:

$ echo 'abc def' | rev | tr 'a-z' 'A-Z'
FED CBA

3. 回文词核对清单——一列单词反转后与原文件对照,变形的是非回文:

$ rev /root/demo/rev/words.txt
level
xunil
noon
utnubu
madam

五、注意事项与常见问题

本节汇总 rev 使用中最容易踩坑的四个问题,均对应前文实测结论。

Q1:rev 与 tac 有什么区别?

两者都叫「反转」但粒度不同:rev 反转每行内部的字符顺序(行序不变),tac 反转文件的行顺序(每行内容不变)。想倒着看日志用 tac,想反转字符串用 rev;两者都接受文件参数。

Q2:rev 处理中文为什么报错或输出乱码?

rev 是宽字符实现,「字符」的解码依赖 locale:C locale 下 UTF-8 中文无法解码,直接报 Invalid or incomplete multibyte or wide character(3.4 节实测)。解决:LANG=C.UTF-8 rev 或在 UTF-8 locale 的终端中运行,即可按整字正确反转。

Q3:rev 有工作参数吗?

几乎没有。2.37.2 版本只有 -h/--help 与 -V/--version(2.2 节帮助原文),没有任何控制反转行为的选项。所有花样——截取、大小写、去空白——都靠管道组合完成。

Q4:反转后行尾的空白跑哪去了?

行内所有字符(含空格、制表符)都参与反转,行尾空格反转后会出现在行首。对格式敏感的处理先 sed 's/[[:space:]]*$//' 清理行尾空白,再交给 rev。

六、参考链接