我正在尝试为一些具有多个 NIC 和 VLAN 的嵌入式设备创建一个整洁的 motd。
以下是示例输出:
Networking sent recv tx-err rx-err address
enp7s0 UP 66K 154 0 0 10.10.0.4
enp7s0.10 UP 0 17 0 0 10.1.10.4
enp7s0.2 UP 0 17 0 0 10.1.2.1
enp7s0.3 UP 0 17 0 0 10.1.3.4
tun0 UP 0 17 0 0 10.x.x.x
我希望上面的输出将 enp7s0.10 作为最后一项。如下所示:
enp7s0 UP 66K 154 0 0 10.10.0.4
enp7s0.2 UP 0 17 0 0 10.1.2.1
enp7s0.3 UP 0 17 0 0 10.1.3.4
enp7s0.10 UP 0 17 0 0 10.1.10.4
tun0 UP 0 17 0 0 10.x.x.x
我尝试使用 对输出进行排序sort -t "." -n -k 2
,虽然结果很接近,但并没有完全满足我的需求。我真正需要的是两层排序:首先按前缀排序(即“。”左侧的所有内容),然后按后缀排序。
我正在努力用纯 bash 完成这项工作。我想避免使用 perl 或 python 来完成这项工作(因为我运行的硬件 CPU 很少),宁愿忍受无法清理它的轻微烦恼。
有任何想法吗?
答案1
sort -V
如果您的‘排序’版本具有此功能,请使用“版本排序” 。
还有一个natsort
用 C 语言编写的工具,我思考它的新位置是https://github.com/sourcefrog/natsort
我不会避免使用 Perl,一个完全独立的 Perl(甚至 PHP)脚本通常可以比调用大量 greps 和 seds 和其他外部工具的 shell 脚本更快地完成工作。