计算非终止输入的行数

blu*_*ner 6 bash wc

有没有办法计算非终止输入源的行数?例如,我想运行以下一段时间来统计请求数:

ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" | wc
Run Code Online (Sandbox Code Playgroud)

显然,这是行不通的。当我Ctrl+C杀死它时,我不会从wc. 如果可以,我宁愿避免创建文件。

Kyl*_*nes 5

从终端输入Ctrl+C发送SIGINT到前台进程组。如果你想wc在这个事件中幸存下来并产生输出,你需要让它忽略信号。

解决方案是wc在子shell 中运行,并SIGINT在运行之前将其父shell 设置为忽略wcwc将继承此设置并且在SIGINT发送到进程组时不会死亡。管道的其余部分将死亡,wc从另一端没有进程的管道中读取数据。这将导致在管道wc上看到EOF,然后它将输出其计数并退出。

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

  • 您可能希望在该子shell 中包含`grep` 或添加`--line-buffered` 选项(如果是GNU grep)。否则,您将不会计算存储在 `grep` 输出缓冲区中的行,这些行在 CTRL-C 时尚未刷新。 (2认同)