特定のパターンで始まるインターフェイスのみを表示する方法

特定のパターンで始まるインターフェイスのみを表示する方法

Open-Vswitchは仮想インターフェイスを作成し、すべて次のモードを持ちます。s[digit]-eth[digit]例:s1-eth1, s1-eth2, s12-eth3, s2-eth3 ...

次の情報を表示したい。-例えば-s1で始まるすべてのインタフェース(この例ではs1-eth1andを提供する必要がありますs1-eth2)

このコマンドを試しましたが、情報の最初の行だけが表示されます。

ここに画像の説明を入力してください。

私は次の情報に興味がありますRX packets, TX packets, erros, HWaddr..

ここに画像の説明を入力してください。

答え1

ifconfig出力には各インターフェイス間に空白行がawkあるのでperl。 「段落」は、1つ以上の空行で他のブロックと区別されたテキストブロックです。

たとえば、

ifconfig | awk -v RS='' '/^s1-eth[12]:/ {print}'

awk上記の例では、レコード区切り文字()をawk空のRS文字列に設定して、個々の行ではなく段落を処理します。この場合、各段落が一致するかどうかをテストし、一致する^s1-eth[12]:と印刷されます。

私のシステムの出力例:

$ ifconfig | awk -v RS='' '/^(ppp0|lo):/ {print}'
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 64237556  bytes 36962222928 (34.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64237556  bytes 36962222928 (34.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1412
        inet ip.ip.ip.ip  netmask 255.255.255.255  destination ip.ip.ip.ip
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 28220997  bytes 19305565357 (17.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21719890  bytes 3009382446 (2.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

もはや段落単位で印刷されません。各インターフェイス「レコード」の間に空白行はありません。出力に段落を含めるには、出力レコード区切り記号(ORS)を2つの改行(\n\n)に設定します。例えば

ifconfig | awk -v RS='' -v ORS='\n\n' '/^(ppp0|lo):/ {print}'

ipの代わりに出力を使用して同様の操作を実行するのはifconfig少し複雑です。 ipきちんとした段落で区切られた出力を生成しません。ただし、各インタフェースをブロックとして出力します。ここで、インターフェイス番号の後にはコロン、行の先頭の空白、そのインターフェイスの残りの詳細が続きます。

この機能を利用するには、RSを正規表現((^|\n)[0-9]+:)に設定してください。後にコロンとスペース()が続くすべての[0-9]+:数字と一致します。誰でもファイルの先頭(^最初のレコードと一致するため、そうでなければスキップされます)または改行の直後。

たとえば、私のシステムでは次のようになります。

$ ip addr | awk -v RS='(^|\n)[0-9]+: ' '/^(lo|eth0):/ {print}'
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
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 01:33:ed:b0:13:a9 brd ff:ff:ff:ff:ff:ff

(私のeth0IPアドレスは、仮想マシンとDockerコンテナ間のブリッジとして設定したため、IPアドレスがありません。IPアドレスはインターフェイスにありますbr0。)

答え2

以下を使用して一致する行を印刷できます。grep -AnN以下は行数が異なる可能性があるため、少し汚れています。

もっと便利かもしれませんawk。これにより、またはenp1で始まるすべての部分が印刷されますenp3。最初のルール!/^ / {p=0}は、行が空白で始まらない場合は変数を消去します。 2番目のルールは、行が目的のインターフェイス名で始まる場合に変数を設定してから設定するかどうかを印刷します。スペースで始まる行は最後のルールとのみ一致するため、前の値に基づいて印刷されます。p/^enp[13]/ {p=1}pp

# /sbin/ifconfig -a  |awk '!/^ / {p=0} /^enp[13]/ {p=1}; p'
enp1s0    Link encap:Ethernet  HWaddr ... 
          inet addr:...
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:135284106 errors:0 dropped:0 overruns:0 frame:0
          TX packets:144695 errors:0 dropped:0 overruns:0 carrier:2
          collisions:0 txqueuelen:1000 
          RX bytes:8292624956 (8.2 GB)  TX bytes:16595674 (16.5 MB)
enp3s0    Link encap:Ethernet  HWaddr ...  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

あなたの場合は、もちろん同様のパターンを使用します/^s1-eth/

答え3

たとえば、次から始まるすべてのインターフェイスに関する情報を表示したいとします。s1

使用net-tools:

ifconfig | grep s1 -A9

使用iproute2:

ip -s link | grep s1 -A7

答え4

後処理の場合、最新バージョンではiproute2この目的のために設計されたJSON出力形式を使用できます。

ip -j -s link show |
  jq -r '
    .[]|
    select(.ifname|test("^s\\d+-eth\\d+$"))|
    [.ifname, .stats64.rx.bytes, .stats64.tx.bytes]|
    @csv'

たとえば、インターフェイス名、RX、およびTXバイトを含むCSV出力を取得します。

関連情報