rev 是什么
rev 是 util-linux 提供的小工具,把每一行文本的字符顺序整个倒过来,逐行处理、不改行序也不改行数。它最早来自 BSD,如今随 util-linux 出现在各 Linux 发行版中,一般的 CentOS、Ubuntu、Debian 都能直接用。它的实用价值集中在「后缀对齐」类问题上:按域名顶级域排序、按 IP 地址末位分组,都是先 rev、再排序、最后 rev 回来的套路。
基本信息
| 适用平台 | util-linux(Linux 全系)、BSD 系系统 |
|---|---|
| 语法 | rev [文件...] |
| 输入来源 | 不给文件名时从标准输入读取,管道中最常用 |
| 编码影响 | 按当前 locale 字符集处理多字节字符,结果与设置有关 |
典型使用场景
- 按域名后缀分组排序:先 rev、sort、再 rev 还原,让同一顶级域的记录相邻
- 日志里按 IP 段末位归组:地址反转后排序,相邻网段会聚到一起
- 把以路径结尾的清单排到一起,使同一目录下的条目连续排列
- 快速反转字符串,做回文判断或字符串小实验
- 配合 cut 或 awk 处理靠右对齐字段的排序需求
- 生成变形测试数据,验证程序是否对字段书写顺序敏感
- 排查排序结果异常时,临时观察字符的真实排列
常用示例
常用示例
echo 'a.b.c' | rev # 输出 c.b.a
rev hosts.txt > hosts.rev # 逐行反转整个文件
cut -d. -f1 domains.txt | rev | sort | rev # 按顶级域尾部排序
printf 'abc\n中文\n' | rev # 中文按当前 locale 处理,注意编码
LC_ALL=C rev file.txt | head # 强制按字节处理,结果可预期
rev file.txt | diff - file.txt # 与原文件比对,可挑出内容回文的行
tac file.txt | rev # 行序倒置叠加字符反转
rev access.log | sort | rev | head # 反转-排序-还原的三段式用法行为与影响
| 项 | 说明 | 备注 |
|---|---|---|
| 处理单位 | 默认按字符处理,受 locale 影响 | LC_ALL=C 时按字节,多字节字符会被拆开 |
| 行序 | 保持原顺序不变 | 只反转每行内部字符 |
| 行数 | 不减少也不增加 | 换行符本身不参与反转 |
| 无参调用 | 从标准输入读取 | 管道与重定向场景常用 |
| 输出位置 | 默认写标准输出 | 需要落盘自行重定向 |
rev 按字节还是按字符取决于 locale 与具体实现:处理中文、emoji 等多字节内容时保持 UTF-8 区域设置更安全,否则可能切出乱码;反过来,若你就想按字节观察,用 LC_ALL=C 可以明确表达意图。
排序套路要记住三次方向:cut 取字段、rev 把要排序的部分翻到前面、sort 排完再 rev 回来。少了最后一步,输出的字段顺序就是反的,肉眼很容易忽略。
复杂字段重排(按第几列排序、交换两列位置)交给 awk 或 cut 更省事,rev 只适合「整行翻转」这种简单变换,把它当通用文本处理器会写出一串难懂的管道。