インターフェイスごとに1行に「ip addr」を表示する

インターフェイスごとに1行に「ip addr」を表示する

私が管理しているすべてのサーバーのさまざまなインターフェイスのネットワーク構成に関する特定の情報を印刷したいと思います。

  • インターフェース名
  • インターフェイスIPv4アドレス
  • インターフェイスハードウェアMACアドレス

残念ながら、単純ファイルでは、改行ip -o addr showのために出力を簡単に解析できません。awk

ip addr showで印刷できますか?正確にインターフェイスごとに1つのワイヤ?

awkそれ以外の場合は、and / 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アドレスのリストを1行に1つずつインポートします。

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これは各インターフェイスの出力を1行に圧縮する方法です。最初の行を除いて、各インターフェイスの開始前に改行文字を印刷し、ファイルの末尾に改行文字を印刷します。

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

関連情報