漂亮的“ip 路由”显示

漂亮的“ip 路由”显示

我想使用更多的iproute2ip命令)实用程序而不是已弃用的net-toolsifconfig,,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

答案1

软件包iproute2(Debian、Ubuntu)和iproute软件包(CentOS、RedHat)都包含专门为此设计的实用程序:routel,列出具有漂亮输出格式的路由

输出示例:

[2022-02-12 04:21:05]» routel
         target            gateway          source    proto    scope    dev tbl
        default        192.168.1.1                                   ob-top 
   10.171.32.0/ 24                     10.171.32.1   kernel     link lxdbr0 
   169.254.0.0/ 16                                              link ob-top 
    172.17.0.0/ 16                      172.17.0.1   kernel     linkdocker0 
   192.168.1.0/ 24                   192.168.1.101   kernel     link ob-top 
 192.168.122.0/ 24                   192.168.122.1   kernel     link virbr0  
    10.171.32.0          broadcast     10.171.32.1   kernel     link lxdbr0 local
    10.171.32.1              local     10.171.32.1   kernel     host lxdbr0 local
  10.171.32.255          broadcast     10.171.32.1   kernel     link lxdbr0 local
      127.0.0.0          broadcast       127.0.0.1   kernel     link     lo local
     127.0.0.0/ 8            local       127.0.0.1   kernel     host     lo local
      127.0.0.1              local       127.0.0.1   kernel     host     lo local
127.255.255.255          broadcast       127.0.0.1   kernel     link     lo local
     172.17.0.0          broadcast      172.17.0.1   kernel     linkdocker0 local
     172.17.0.1              local      172.17.0.1   kernel     hostdocker0 local
 172.17.255.255          broadcast      172.17.0.1   kernel     linkdocker0 local
    192.168.1.0          broadcast   192.168.1.101   kernel     link ob-top local
  192.168.1.101              local   192.168.1.101   kernel     host ob-top local
  192.168.1.255          broadcast   192.168.1.101   kernel     link ob-top local
  192.168.122.0          broadcast   192.168.122.1   kernel     link virbr0 local
  192.168.122.1              local   192.168.122.1   kernel     host virbr0 local
192.168.122.255          broadcast   192.168.122.1   kernel     link virbr0 local

答案2

几年后回答我自己的问题......

我刚刚了解到 2018 年 2 月添加了漂亮的颜色显示。这使输出对我来说更容易阅读:

在此输入图像描述

人的IP地址

   -c[color][={always|auto|never}
          Configure color output. If parameter is omitted or always, color
          output is enabled regardless of stdout state. If parameter is auto,
          stdout is checked to be a terminal before enabling color output. If
          parameter is never, color output is disabled. If specified multiple
          times, the last one takes precedence. This flag is ignored if -json
          is also given.

答案3

这个 awk 脚本假设(也许是错误的)输出值是成对的关键词值,例如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数组记录了linkdownlone 关键字。

在数据末尾,标题被排序到索引数组中x,我们遍历所有值找到最大列宽。然后打印列标题,然后打印保存的数据。

答案4

这是一个改编@therealak12 的回答

  • flags通过首先将所有 JSON 值转换为字符串来包含数组jq 'map( with_entries( .value |= tostring ) ) | ...'
  • 添加更多列 ( ip -d ...)
  • 添加所有路由表中的数据 ( ip route show table all)
  • 用于column -ts $'\t'指示制表符作为唯一的列分隔符
ip -d -j route show table all | jq -r 'map( with_entries(  .value |= tostring  ) ) | ["target(dst)", "via(gateway)",  "source(prefsrc/src)", "dev", "protocol(proto)", "scope", "type", "metric", "table", "pref", "flags"], (.[] | [.dst // "-", .gateway // "-", .prefsrc // "-", .dev // "-", .protocol // "-", .scope // "-", .type // "-", .metric // "-", .table // "-", .pref // "-", .flags // "-"]) | @tsv' | column -ts $'\t'

相关内容