我有一个带有数百个网络接口的路由器(当然,其中大部分是虚拟的)。这意味着输出
ip a
显示的线条非常多,给管理和分析带来了困难。项目 1 到 255 按项目编号排序,但从 256 开始,在排序之前计算数字 mod 256,这意味着它们是交错的(例如 256、257、1、258、2...):
# ip a s up
256: veth-99-02@br-vxlan-99-02: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ab:cd:ef:99:88:77 brd ff:ff:ff:ff:ff:ff
inet 10.2.99.254/24 scope global veth-99-02
valid_lft forever preferred_lft forever
257: vxlan-22-01: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br-vxlan-20-01 state UNKNOWN group default qlen 1000
link/ether ab:cd:ef:99:88:77 brd ff:ff:ff:ff:ff:ff
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
258: br-vxlan-22-01: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
link/ether ab:cd:ef:99:88:77 brd ff:ff:ff:ff:ff:ff
2: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether ab:cd:ef:99:88:66 brd ff:ff:ff:ff:ff:ff
有没有办法按数字正确排序此输出? (它们是多行条目,所以| sort -n
不行。)
或者,我可以选择显示数字,例如最多 42 个吗?
我尝试按类型 ( ) 选择ip a s type ...
,但这实际上不起作用。
答案1
有一个选项可以在单独的行中输出每个信息-o
:
-o, -oneline
将每个记录输出在一行上,用“\”字符替换换行符。当您想要使用 wc(1) 或 grep(1) 输出对记录进行计数时,这很方便。
所以ip -o a s up |sort -n
应该做这项工作;ip -o a s up |sort -n |tr '\\' '\n'
如果需要的话,您可以将这些反斜杠转换回换行符。
似乎在使用-o
选项时,它会丢失一些信息(我不知道为什么);那么您可以在传递给排序命令之前使用以下 awk 预处理替代方案:
ip a s up \
| awk '{ printf "%s" (NR>1 && /^[0-9]+:/?"\0":(NR>1?"\n":"")) $0 }' \
| sort -nz \
| tr '\0' '\n'
即在每个接口块之间添加空字符,然后使用 sort with 对-z
空分隔记录的输入进行排序,最后使用 将这些空字符恢复为换行符tr
。
答案2
使用 GNU awk:
ip a s up | gawk '
match($0, /^([0-9]+): /, m) {
if (prev) ip[prev] = lines
prev = m[1]
lines = ""
}
{ lines = lines $0 RS }
END {
if (prev) ip[prev] = lines
PROCINFO["sorted_in"] = "@ind_num_asc"
for (num in ip) print ip[num]
}
'