答え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
(私のeth0
IPアドレスは、仮想マシンとDockerコンテナ間のブリッジとして設定したため、IPアドレスがありません。IPアドレスはインターフェイスにありますbr0
。)
答え2
以下を使用して一致する行を印刷できます。grep -An
N以下は行数が異なる可能性があるため、少し汚れています。
もっと便利かもしれませんawk
。これにより、またはenp1
で始まるすべての部分が印刷されますenp3
。最初のルール!/^ / {p=0}
は、行が空白で始まらない場合は変数を消去します。 2番目のルールは、行が目的のインターフェイス名で始まる場合に変数を設定してから設定するかどうかを印刷します。スペースで始まる行は最後のルールとのみ一致するため、前の値に基づいて印刷されます。p
/^enp[13]/ {p=1}
p
p
# /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出力を取得します。