5206

[code]

    #!/bin/bash
    ipaddr="10.0.1.1"
    count=10
    
    echo "Ping to: $ipaddr"
    echo "Ping count: $count"
    echo "Ping average[ms]:"
    
    #Pingコマンドを実行し、結果をファイルに出力
    ping -c $count $ipaddr > ping.txt
    
    #time=??ms部分をsedで取り出し（|¥で改行）
    sed -n "s/^.*time=¥(.*¥) ms/¥1/p" ping.txt |¥
    #行数(NR)で割って、平均を求める
    awk '{sum+=$1} END{print sum/NR}' > ping2.txt
    
[/code]

これを実行すると、エラーになってしまいます。

/Users/hoge/Ping/ping.sh: line 14: unexpected EOF while looking for matching
`''  
/Users/hoge/Ping/ping.sh: line 15: syntax error: unexpected end of file

Pingの結果は下記のようなフォーマットで返ってきています。

[code]

    $ ping -c 10 10.0.1.1
    PING 10.0.1.1 (10.0.1.1): 56 data bytes
    64 bytes from 10.0.1.1: icmp_seq=0 ttl=255 time=3.019 ms
    64 bytes from 10.0.1.1: icmp_seq=1 ttl=255 time=1.976 ms
    64 bytes from 10.0.1.1: icmp_seq=2 ttl=255 time=1.973 ms
    64 bytes from 10.0.1.1: icmp_seq=3 ttl=255 time=2.005 ms
    64 bytes from 10.0.1.1: icmp_seq=4 ttl=255 time=1.959 ms
    64 bytes from 10.0.1.1: icmp_seq=5 ttl=255 time=1.415 ms
    64 bytes from 10.0.1.1: icmp_seq=6 ttl=255 time=1.977 ms
    64 bytes from 10.0.1.1: icmp_seq=7 ttl=255 time=1.976 ms
    64 bytes from 10.0.1.1: icmp_seq=8 ttl=255 time=1.453 ms
    64 bytes from 10.0.1.1: icmp_seq=9 ttl=255 time=2.000 ms
    
[/code]


CC BY-SA 3.0
2015-01-24T09:04:34.037
5199
2015-06-15T01:20:34.120
2015-01-24T16:57:40.713
7214
7590
question
macos sh sed awk
sedとawkを用いてping平均時間を求めたい（OSX bash）


回答ではないのですが、質問者様が実行したい処理は以下の様なものではないでしょうか。

[code]

    #!/bin/bash
    
    ipaddr="10.0.1.1"
    count=10
    
    echo "Ping to: $ipaddr"
    echo "Ping count: $count"
    echo -n "Ping average[ms]: "
    
    ping -c $count $ipaddr | 
      awk 'BEGIN{FS="(time=|ms)"}/time=/{sum+=$2;i++}END{print sum/i}' |
      tee ping.txt
    
[/code]

ただ、Mac OSX デフォルトの awk(BSD由来) では期待通りの結果が得られるのかどうかは不明です(awk の FS
変数に正規表現が使用できるのかどうか？)。

追記:

round trip time の平均値が分かればよい、ということであれば、以下の様にもできます(bash 前提)。

[code]

    $ ping -c 10 10.0.1.1 | tail -1 | tee >(cut -d/ -f5)
    
[/code]

追記その2:

ご質問の主旨からは外れますが、ping の結果(rtt)を整形して表示する awk スクリプトも載せておきます。

[code]

    #!/bin/bash
    
    ipaddr="10.0.1.1"
    count=10
    
    echo "Ping to: $ipaddr"
    echo "Ping count: $count"
    echo "Round trip time:"
    
    ping -c "$count" "$ipaddr" | tail -1 | 
      awk '
        BEGIN{RS=" *= *|\n";FS="/|^rtt *| *ms$"}
        {
          if ($1 == "") {for(i=1;i<NF;i++){$i=$(i+1)};NF--}
          for(i=1;i<=NF;i++){rtt[NR][i] = $i}
        }
        END{
          for(i=1;i<NF;i++){
            printf("%5s = %.3f ms\n", rtt[NR-1][i], rtt[NR][i])
          }
        }
      '
    
[/code]


CC BY-SA 3.0
2015-01-24T11:24:29.547
5205
2015-01-25T01:54:07.100
2015-01-25T01:54:07.100
5199
answer


質問に書いてあったエラーが出ないので、 `line 13: ¥: command not found` の問題を。

[code]

    sed -n "s/^.*time=¥(.*¥) ms/¥1/p" ping.txt |¥
    
[/code]

の行末の `¥` が不要です。

[code]

    #!/bin/bash
    ipaddr="ja.stackoverflow.com"
    count=5
    
    echo "Ping to: $ipaddr"
    echo "Ping count: $count"
    echo "Ping average[ms]:"
    
    #Pingコマンドを実行し、結果をファイルに出力
    ping -c $count $ipaddr > ping.txt
    
    #time=??ms部分をsedで取り出し（|¥で改行後、行数(NR)で割って、平均を求める）
    cat ping.txt | sed -n "s/^.*time=\(.*\) ms/\1/p" ping.txt |
        awk '{sum+=$1} END{print sum/NR}' > ping2.txt
    
[/code]

それから、次回 bash スクリプトを書くときは、ファイル先頭行の

[code]

    #!/bin/bash
    
[/code]

を、

[code]

    #!/bin/bash -v
    
[/code]

に変えてから始めてみてください。気持ち問題に気付きやすくなるはずです。


CC BY-SA 3.0
2015-01-24T11:51:22.667
5206
2015-01-24T11:51:22.667
4978
5199
answer


ありがとうございました。無事動作しました。

[code]

    #!/bin/bash -v
    ipaddr="10.0.1.1"
    count=10
    
    echo "Ping to: $ipaddr"
    echo "Ping count: $count"
    echo "Ping average[ms]:"
    
    #Pingコマンドを実行し、結果をファイルに出力
    ping -c $count $ipaddr > ping.txt
    
    
    #time=??ms部分をsedで取り出し（|¥で改行後、行数(NR)で割って、平均を求める）
    cat ping.txt | sed -n "s/^.*time=\(.*\) ms/\1/p" ping.txt |
    awk '{sum+=$1} END{print sum/NR}' > ping2.txt
    cat ping2.txt
    
[/code]

こちらも目から鱗でした。たしかにbashなのでこれで十分ですね。  
$ ping -c 10 10.0.1.1 | tail -1 | tee >(cut -d/ -f5)


CC BY-SA 3.0
2015-01-24T12:05:09.957
5207
2015-01-24T12:05:09.957
7590
5199
answer


awkを使ったワンライナーの例を２つ紹介します。

例１

[code]

    $ ping -c 5 ja.stackoverflow.com | awk -F"/" '{print} END {printf("\n---\navg: %s\n", $5)}'
    PING ja.stackoverflow.com (198.252.206.16): 56 data bytes
    64 bytes from 198.252.206.16: icmp_seq=0 ttl=46 time=334.556 ms
    64 bytes from 198.252.206.16: icmp_seq=1 ttl=46 time=370.802 ms
    64 bytes from 198.252.206.16: icmp_seq=2 ttl=46 time=500.598 ms
    Request timeout for icmp_seq 3
    64 bytes from 198.252.206.16: icmp_seq=3 ttl=46 time=1174.977 ms
    64 bytes from 198.252.206.16: icmp_seq=4 ttl=46 time=555.384 ms
    
    --- ja.stackoverflow.com ping statistics ---
    5 packets transmitted, 5 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 334.556/587.263/1174.977/304.845 ms
    
    ---
    avg: 587.263
    
[/code]

例２

[code]

    $ ping -c 5 ja.stackoverflow.com | awk '$2=="bytes" {split($7, arr, "="); i++; sum += arr[2]; print arr[2]} END {print "--"; print sum / i}'
    342.768
    327.314
    334.996
    392.753
    324.054
    --
    344.377
    
[/code]


CC BY-SA 3.0
2015-06-15T01:20:34.120
11346
2015-06-15T01:20:34.120
9529
5199
answer