単一のコマンドで2つの区切り文字を使用してawkから結果を取得する

単一のコマンドで2つの区切り文字を使用してawkから結果を取得する

pingコマンドからのみ出力:

[root@servera ~]# ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=8.04 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=7.47 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=7.72 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=7.50 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 7.473/7.683/8.037/0.225 ms

「4戻り」で整数4をキャプチャしたい。

ping -c 4 8.8.8.8 | awk -F ',' '/received/ { print $2 }'

明らかになる 4 received。上記のコマンドから数字4だけをキャプチャしたいと思います。どうすればいいですか?今、区切り文字は空白です。

ベストアンサー1

必要なものは次のとおりです。

awk '/received/{print $4}'

たとえば、質問とcat file同じ入力を取得するには、次のようにします。awk

$ cat file
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=8.04 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=7.47 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=7.72 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=7.50 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 7.473/7.683/8.037/0.225 ms

$ cat file | awk '/received/{print $4}'
4

明らかに実際のテストcat fileに置き換えてください。ping -c 4 8.8.8.8

以下のOPのコメントに応じて、どの行が一致するかを尋ねます。

$ awk '/received/' file
4 packets transmitted, 4 received, 0% packet loss, time 3007ms

そして、フィールド4が印刷される理由は次のとおりです。

$ awk '/received/{for (i=1; i<=NF; i++) print i, "<" $i ">"}' file
1 <4>
2 <packets>
3 <transmitted,>
4 <4>
5 <received,>
6 <0%>
7 <packet>
8 <loss,>
9 <time>
10 <3007ms>

おすすめ記事