Iproute

“ip route”的漂亮展示

  • February 12, 2022

我想使用更多的iproute2( ipcommand) 實用程序而不是已棄用的net-tools( ifconfig, route, …)。

我繼續返回的主要原因是,與特別提供列標題的舊版本相比,我認為net-tools其輸出缺乏清晰度:ip route``route

  • ip路由:
default via 192.168.134.254 dev enp1s0  proto static  metric 100 
10.42.0.0/24 dev wlp2s0  proto kernel  scope link  src 10.42.0.1  metric 600 
10.56.30.0/24 dev enx00133b0402c2  proto kernel  scope link  src 10.56.30.143 
169.254.0.0/16 dev wlp2s0  scope link  metric 1000 
192.168.57.0/24 dev vboxnet1  proto kernel  scope link  src 192.168.57.1 linkdown 
192.168.134.0/24 dev enp1s0  proto kernel  scope link  src 192.168.134.142  metric 100 
  • 路線:
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.134.254 0.0.0.0         UG    100    0        0 enp1s0
10.42.0.0       *               255.255.255.0   U     600    0        0 wlp2s0
10.56.30.0      *               255.255.255.0   U     0      0        0 enx00133b0402c2
link-local      *               255.255.0.0     U     1000   0        0 wlp2s0
192.168.57.0    *               255.255.255.0   U     0      0        0 vboxnet1
192.168.134.0   *               255.255.255.0   U     100    0        0 enp1s0

問題:有沒有辦法使用ip命令清晰/漂亮地顯示路線?

這個 awk 腳本假設,可能是錯誤的,輸出值是成對的關鍵字 value,例如scope link,有一些例外,如第一列和linkdown關鍵字。它累積列和數據並列印結果:

awk '
{   i = 1; h = " ip"
   hdr[h] = 1
   col[h,NR] = $i
   for(i=2;i<=NF;){
       if($i=="linkdown"){extra[NR] = $i; i++; continue}
       hdr[$i] = 1
       col[$i,NR] = $(i+1)
       i += 2
   }
}
END{     #PROCINFO[sorted_in] = "@ind_str_asc"
   n = asorti(hdr,x)
   for(i=1;i<=n;i++){ h = x[i]; max[h] = length(h) }
   for(j = 1;j<=NR;j++){
       for(i=1;i<=n;i++){
           h = x[i]
           l = length(col[h,j])
           if(l>max[h])max[h] = l
       }
   }
   for(i=1;i<=n;i++){ h = x[i]; printf "%-*s ",max[h],h }
   printf "\n"
   for(j = 1;j<=NR;j++){
       for(i=1;i<=n;i++){ h = x[i]; printf "%-*s ",max[h],col[h,j] }
       printf "%s\n",extra[j]
   }
}'

結果超過 80 列:

ip              dev             metric proto  scope src             via             
default          enp1s0          100    static                       192.168.134.254 
10.42.0.0/24     wlp2s0          600    kernel link  10.42.0.1                       
10.56.30.0/24    enx00133b0402c2        kernel link  10.56.30.143                    
169.254.0.0/16   wlp2s0          1000          link                                  
192.168.57.0/24  vboxnet1               kernel link  192.168.57.1                    linkdown
192.168.134.0/24 enp1s0          100    kernel link  192.168.134.142                 

該腳本使用關聯數組hdr來保存找到的關鍵字,二維col數組由該關鍵字和行號索引以保存值。第一列使用發明的ip關鍵字進行特殊處理,該關鍵字具有前導空格,以確保它被排序到第一列。該extra數組記錄了linkdown唯一的關鍵字。

在數據的末尾,標題被排序到索引數組x中,我們遍歷所有值以找到最大列寬。然後列印列標題,然後列印保存的數據。

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