1

stdinからデータを読み取り、解析された行ごとにシェルコマンドを実行して、その出力を回復したいと思います。

ここにほとんど機能する例があります:

[root@eulbi002] # ping eulbi001 | awk -F'[ =]' '/64 bytes/{"date +%s"|getline D; print D,$11}'
1360069298 0.056
1360069298 0.051
1360069298 0.051

コマンド'date+%s'が実行され、出力を回復できますが、実行はすべての一致ではなく、1回だけ行われるように見えます。

最終的な目的は、出力をストレージ用にrrdtoolに渡すことであり、rrdtoolは各レコードのタイムスタンプを必要とします。

@Ed Mortonは、実用的な解決策を指摘することに加えて、組み込みの時間関数を備えたgawkについて言及しました。これは最もエレガントなソリューションです。

[root@eulbi002] # ping eulbi001 | awk -F'[ =]' '/64 bytes/{print systime(),$11}'
1360069298 0.056
1360069298 0.051
1360069298 0.051
4

1 に答える 1

4

ここでさらに別の getline 警告が発せられた場合に備えて ( http://awk.info/?tip/getlineを参照)、呼び出しのたびにパイプを閉じてみてください。

ping eulbi001 |
awk -F'[ =]' 'BEGIN{cmd="date +%s"} /64 bytes/{cmd|getline D; close(cmd); print D,$11}'

異なる結果が得られるかどうかを確認します。ただし、呼び出しのたびに D が変更されるとは思わないでください。必要に応じて、タイムスタンプの粒度を小さくするために「.%N」を追加できます。

さらに良いことに、組み込みの時間関数で GNU awk を使用すると、このようなことをまったく処理する必要がなくなります。

于 2013-02-05T15:28:01.720 に答える