ベストアンサー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
。)