Sort
我可以對ip地址的輸出進行排序嗎?
我有一個帶有幾百個網路介面的路由器(其中大部分是虛擬的,自然)。這意味著輸出
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
。