【发布时间】:2020-05-15 07:37:27
【问题描述】:
我有一个来自tshark 过滤器的大型终端输出,我想检查行数(本例中的包数)是否达到阈值 X。
该操作是在许多大文件的循环中完成的,所以我想在这里将性能提升到最大。
我想知道的是wc -l是计算终端命令输出的最快方法。
我的行看起来是这样的:(所以 tshark 命令在这里无关紧要,所以我将其替换为可读性)
THRESHOLD=100
[[ $(tshark -r $file -Y "tcp.stream==${streamID}" | wc -l) -gt $THRESHOLD ]] || echo "not enough"
虽然这几乎可以正常工作,但我想知道是否有办法在阈值之后停止。只要达到(或未达到)阈值,确切的数字并不重要。
猜测是:
HEAD=$((THRESHOLD+1))
[[ $(tshark -r $file -Y "tcp.stream==${streamID}" | head -n $HEAD | wc -l) -gt $THRESHOLD ]] || echo "not enough"
但是通过管道传输到附加服务并增加阈值可能会更慢,不是吗?
编辑: 将示例代码更改为有效的 tshark sn-p
【问题讨论】:
-
你真的试过计时吗?我不认为我可以模拟你的平台
-
你的想法是正确的。避免产生额外的进程。你的问题是小鸡还是先有蛋的问题。在进行有效比较之前,您必须至少阅读
$THRESHOLD行(或EOF)。由于您正在管道tsharks output,因此该过程将在传递给wc或head之前完成。除非$THRESHOLD和文件大小之间有数十万行+ 差异,否则我不知道您在wc或head之间节省任何时间。您只需要对最坏的情况进行计时,然后再看看。 -
在我的场景中,这一步很难隔离和计时(需要更多的编码),所以我的想法是在开始工作之前先考虑一下,最终一无所获。感谢大卫的回答...
-
您可以将
tsharks的输出通过管道传送到一个程序中,该程序不仅如您所描述的那样验证它,然后关闭它的标准输入。然后作者 (tsharks) 应该用 broken pipe 中止。 -
@user1934428
head已经关闭了标准输入。