rev 命令详解与参数实测(Ubuntu 22.04)
rev 命令逐参数实测:每行字符反转、回文检测、管道组合提取路径末段与中文 locale 差异,全部回显在 Ubuntu 22.04(util-linux 2.37.2)实测通过。
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。
六、参考链接
- Ubuntu 22.04 (jammy) 在线 man 手册 rev(1):https://manpages.ubuntu.com/manpages/jammy/en/man1/rev.1.html
- util-linux 项目主页(rev 所属软件包):https://github.com/util-linux/util-linux
- 本系列关联篇:《tr 命令详解与参数实测(Ubuntu 22.04)》《wc 命令详解与参数实测(Ubuntu 22.04)》