Sort

我可以對ip地址的輸出進行排序嗎?

  • August 6, 2021

我有一個帶有幾百個網路介面的路由器(其中大部分是虛擬的,自然)。這意味著輸出

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 ...) 進行選擇,但這並沒有真正起作用。

有一個選項可以在單獨的行中輸出資訊-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

引用自:https://unix.stackexchange.com/questions/663557