場合によっては、「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/24
10.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}
'