テキストファイルから時間を抽出する

テキストファイルから時間を抽出する

そこで、テキスト ファイルに保存されている Web サーバーの ping から往復時間を抽出する Linux のシェル スクリプトを作成しようとしています。基本的に、次のようなテキスト ファイルがあります。

    PING e11699.b.akamaiedge.net (104.100.153.112) 56(84) bytes of data.
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=17.2ms
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=12.6ms
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=11.7ms
    ... (a bunch more ping responses here)
    --- e11699.b.akamaiedge.net ping statistics ---
    86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
    rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2

そこで、sed を使用して、テキスト ファイルから 17.2、12.6、11.7 などの回数だけを抽出してみることにしました。以下は私の sed 行です。

    sed 's/.*(time=\([0-9]*\(\.[0-9]*\)\{0,1\}\) ms/\1/' pingoutput.txt | sort -n > sortedtime.txt 

この行は、必要なすべての行を正常に抽出して並べ替えましたが、ping テキスト ファイルから不要な行もいくつか抽出しました。作成されたテキスト ファイルは次のようになります。

--- e11699.b.akamaiedge.net ping statistics ---
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2
11.7
12.6
17.2
...
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms

テキスト ファイルの不要な「---e11699」を「パイプ 2」に、「86400 パケット」を「86532481ms」行に抽出することを回避する方法があれば、ご協力いただければ幸いです。

答え1

私は次のsedを使用しました:

sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n

サンプルファイル(times)の場合:

PING e11699.b.akamaiedge.net (104.100.153.112) 56(84) bytes of data.
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=17.2ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=12.6ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=11.7ms
... (a bunch more ping responses here)
--- e11699.b.akamaiedge.net ping statistics ---
86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2

次のような結果が得られます:

sed -n 's/.*time=\([0-9].*\)ms.*/\1/p' times | sort -n
11.7
12.6
17.2


-n不要な線を取り除くためにスイッチを 使用しました。出典man sed:

-n By default, each line of input is echoed to the standard output after all of the commands have been applied to it. The -n option suppresses this behavior.

答え2

grep正規表現を使用する場合は、pcre次のようになります:

$ grep -oP 'time=\K[0-9.]+' ip.txt | sort -n
11.7
12.6
17.2
  • -o一致するパターンのみを印刷する
  • -Ppcre正規表現を使用する
  • time=\K肯定的な後読み、出力の一部ではない
  • [0-9.]+1つ以上の数字と.文字
  • sort -n数値順に並べ替える

単独でperl

$ perl -nle 'push(@a,/time=\K([0-9.]+)/g); END{ print foreach sort {$a <=> $b} @a }' ip.txt 
11.7
12.6
17.2
  • ここでは、一致するパターンで配列が設定され、最後に数値でソートされた配列が出力されます。

答え3

grep 'time=' pingoutput.txt | awk '{print $8}'

関連情報