使用grep和awk过滤ping结果并不起作用

时间:2016-12-15 10:47:22

标签: linux shell awk grep

我想将ping输出只用延迟时间传递给文本。 虽然我这样做,但我按照预期得到了这个

ping somesite 
PING somesite  (220.181.57.217) 56(84) bytes of data.
64 bytes from 220.181.57.217: icmp_seq=1 ttl=52 time=43.4 ms
64 bytes from 220.181.57.217: icmp_seq=2 ttl=52 time=43.7 ms
64 bytes from 220.181.57.217: icmp_seq=3 ttl=52 time=43.4 ms

然后我这样做

ping somesite | awk -F '[:=]'  '{print $5}'

43.3 ms
43.2 ms
43.3 ms
43.2 ms
43.2 ms
43.1 ms
43.1 ms
43.3 ms
43.2 ms
43.6 ms
43.3 ms
43.3 ms

所以第一行是空白的,然后我想我必须先摆脱它。

ping somesite | grep -v "PING" | awk -F '[:=]'  '{print $5}'

但是没有任何输出。 当我做任何一个

ping somesite | grep -v "PING"

 ping somesite | awk -F '[:=]'  '{print $5}'

它会起作用。将它们放在一起时它没有赢。 我想知道原因。

4 个答案:

答案 0 :(得分:3)

grep命令中由于阻止缓存而导致grep 滚动时,您无法获得任何输出。

您可以grep使用行缓冲,以获取每行的输出:

ping google.com | grep --line-buffered -v "PING" | awk -F '[:=]' '{print $5}'

然而您不需要grep ,因为您可以使用单awk执行此操作:

ping google.com | awk -F '[:=]' 'NR>1{print $5}'

答案 1 :(得分:0)

稍加修改:

ping somesite | awk -F '[:=]'  'NR!=1 {print $5}'

答案 2 :(得分:0)

我已经从答案中找到了答案 https://askubuntu.com/questions/562344/what-does-grep-line-buffering-do

因此,在将行发送到awk之前,grep会将输出缓冲到4096字节。 grep选项--line-buffered将解决我的问题。

答案 3 :(得分:0)

使用NR(记录数)进行检查实际上从输出中删除了第一条记录,

ping somesite | awk -F '[:=]'  'NR!=1 {print $5}'

ping somesite | awk -F '[:=]'  'NR>1 {print $5}'

您可以查看NF(字段数)来过滤任何不符合模式的记录,

ping somesite | awk -F '[:=]'  'NF==5 {print $5}'