每个接口一行中的“ip addr”

每个接口一行中的“ip addr”

我想打印有关我管理的所有服务器上不同接口的网络配置的特定信息:

  • 接口名称
  • 接口 ipv4 地址
  • 接口硬件mac地址
  • ……

不幸的是,由于换行符,简单的文件ip -o addr show不允许轻松解析其输出。awk

是否可以ip addr show打印在确切地每个接口一根线?

否则,是否可以使用awkand/or获得相同的结果sed?这超出了我对这两个命令的了解,因为这些行必须一树一树地连接起来......

答案1

只需使用 --brief 标志即可。

ip --brief address show

答案2

较新版本ip能够使用该-j选项输出 JSON 格式的数据,然后您可以使用过滤器(例如jq.例如,这将打印eth0接口上的 IPv4 地址:

$ ip -j addr show dev eth0 | jq -r '.[0].addr_info | map(select(.family == "inet"))[0].local'
192.168.0.1

或者获取机器上所有 IPv4 地址的列表,每行一个:

ip -j addr show | jq -r 'map(.addr_info) | map(map(select(.family == "inet").local)) | flatten | .[]'
127.0.0.1
192.168.0.1
172.19.0.1
172.17.0.1
172.18.0.1

select(...)例如,删除以包含 IPv6 地址。许多其他变化是可能的。

答案3

ip -o addr show,但打印的信息较少。

这是一种将每个接口的输出压缩ip addr show为一行的方法。在每个界面开始之前打印换行符,第一行除外;然后打印该行内容;在文件末尾打印换行符。

ip addr show |
awk '/^[^ ]/ && NR!=1 {print ""}
     {printf "%s", $0}
     END {print ""}'

答案4

gawk脚本将进行解析ip addr show以提供您所请求的信息。多个 IPv4 地址用逗号连接

ip a | awk 'function outline() {if (link>"") {printf "%s %s %s\n", iface, inets, link}} $0 ~ /^[1-9]/ {outline(); iface=substr($2, 1, index($2,":")-1); inets=""; link=""} $1 == "link/ether" {link=$2} $1 == "inet" {inet=substr($2, 1, index($2,"/")-1); if (inets>"") inets=inets ","; inets=inets inet} END {outline()}'

将其拆分出来,使其更具可读性,

ip addr show |
    awk '
        # Output function to format results (if any)
        function outline() {
            if (link>"") {printf "%s %s %s\n", iface, inets, link}
        }

        # Interface section starts here
        $0 ~ /^[1-9]/ {
            outline();                              # Output anything we previously collected
            iface=substr($2, 1, index($2,":")-1);   # Capture the interface name
            inets="";                               # Reset the list of addresses
            link=""                                 # and MAC too
        }

        # Capture the MAC
        $1 == "link/ether" {
            link=$2                   
        }

        # Capture an IPv4 address. Concatenate to previous with comma
        $1 == "inet" {
            inet=substr($2, 1, index($2,"/")-1);    # Discard /nn subnet mask
            if (inets>"") inets=inets ",";          # Suffix existing list with comma
            inets=inets inet                        # Append this IPv4
        }

        # Input processing has finished
        END {
            outline()                               # Output remaining collection
        }
    '

输出示例

eth0 10.0.2.15 08:00:27:0f:db:b3
eth1 192.168.56.101 08:00:27:33:04:26

相关内容