半構造化入力の「キーワード値」ペアの一致

半構造化入力の「キーワード値」ペアの一致

場合によっては、「Key-Value」ペアを含むコマンドから出力が表示されることがあります。 1行に複数のペアがある場合もあります。再現可能な例として、次のコマンドを考えてくださいip addr show dev eth0

ip addr show dev eth0 | grep -v link/ether
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe0f:dbb3/64 scope link
       valid_lft forever preferred_lft forever

mtuこの例の目的のために、および(inetつまりbrd、ここおよび1500それぞれ)次の値をキャプチャしたい場合があります。各キーワードは、入力に複数回表示されないと仮定できます。10.0.2.15/2410.0.2.255

この問題を処理する唯一の方法は、ソースコマンドの出力を一時変数としてキャプチャし、すべてのキーワードが処理されるまでその変数を繰り返し解析することです。

これらの「Key-Value」ペアを選択して残りのテキストを削除するより簡単でより良い方法はありますか?

提案された例は、順序付けされていない出力を提供します。

ip addr show dev eth0 | someCommand brd inet mtu
mtu 1500
inet 10.0.2.15/24
brd 10.0.2.255

答え1

キー名が最大1回しか表示されないと仮定すると、次のことを試すことができます。

ip addr show dev eth0 | perl -ne 'chomp; foreach $param (qw(mtu inet brd)) { /($param)\s+(\S+)/ && do { print "$1 $2\n"; }}'

答え2

以下は、各単語を1行に配置し、指定されたキーの1つが見つかるたびにそのキーと次の単語を印刷するawkソリューションです。キーは、実際に単語全体と一致する必要がある正規表現です。

ip addr show dev eth1 |
tr -s ' ' '\n' |
awk -v keys='mtu|inet|brd' '
    match($0, "^(" keys ")$") {printf "%s ", $0; getline; print}
'

関連情報