終了しない入力の行数を計算します。

終了しない入力の行数を計算します。

終了していない入力ソースの行数を計算する方法はありますか?たとえば、要求の数を計算するために、一定期間にわたって以下を実行したいとします。

ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" | wc

明らかにこれはうまくいきません。私がそれをCtrl殺したときC、私はそれから何の結果も得られませんwc。可能であれば、ファイルの生成を避けたい。

答え1

Ctrl端末で+を入力すると、フォアグラウンドプロセスグループに送信されます。イベントで生き残って出力を生成するには、信号を無視する必要があります。CSIGINTwc

解決策は、サブシェルで実行し、wc実行する前に親シェルをSIGINT無視するように設定することですwcwcこの設定は継承され、SIGINTプロセスグループに送信されても​​消えません。パイプの残りの部分は消え、wcもう一方の端ではプロセスなしでパイプからの読み取りのみが行われます。これによりパイプがwc表示され、EOFその数を印刷して終了します。

ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" | (trap '' INT ; wc)

答え2

現在のカウントを読んだ後、カウントを続ける方法は次のとおりです。

終了しないテスト入力ソースはpingです。

$ ping 127.0.0.1  
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.041 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.025 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.030 ms
^C

他のソリューションでは、行数を読み取って実行コマンドを中断するタイミングを決定する必要があります。
しかし、理想的には現在の行数だけ知りたいです。そうですか?

それでは行数を数えてみてはいかがでしょうか?作業に適したツールは次のとおりです。nl、各行の前に現在の数を追加します。

$ ping 127.0.0.1 | nl
     1  PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
     2  64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.040 ms
     3  64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.022 ms
     4  64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.025 ms
     5  64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.021 ms
     6  64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.022 ms
     7  64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.022 ms
     8  64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.021 ms
     9  64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.029 ms
^C

答え3

あなたはそれを使用することができます:

$ ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" |
perl -nle 'system("clear");print $.'

perl印刷する前に前の出力を消去し、どの行があるかを追跡します。

答え4

インスタントアクションではなくタイムアウトを指定したい場合は、この方法を使用できます。

(cmdpid=$BASHPID; (sleep 300; Kill $cmdpid) & exec ngrep(ngrepパラメータ))| grep ":80" |

からインスピレーションを受けるこの回答本質的にSUに関する最近の質問です。5分後に実行中のプログラムを停止して続行するには?

関連情報