使用此命令:
$ tar -ztf /tmp/z.txz | grep -m 1 '/packagesite.txz$'
2.2.0/FreeBSD:11:amd64/latest/packagesite.txz
结果很快出现(不到1秒),但随后又继续运行10-15秒,不再有用。 I found out about -m
here,但没有帮助。如果能在找到匹配项后立即中止它,那就太好了。有什么办法吗?仅供参考,必须在/bin/sh
工作。
答案 0 :(得分:0)
您的问题与缓冲有关。这是一种更简单的复制方式。
perl -le 'for (1..1000) { print "$_"; sleep 1 }' | grep -m 1 4
即使您可以通过取出grep
来验证输出的第四行是否匹配,似乎也没有任何反应。
关闭Perl的缓冲解决了紧迫的问题:
perl -le '$| = 1; for (1..1000) { print "$_"; sleep 1 }' | grep -m 1 4
4
(预计输出会在4秒钟后出现)。
对此没有完全可移植的解决方案。看看您是否拥有https://mywiki.wooledge.org/BashFAQ/009中描述的实用程序之一,或者确保tar
产生足够的输出,您可以依靠输出缓冲区填满。
答案 1 :(得分:0)
文件很大或存储设备很慢。 Grep会过滤结果并停止读取管道,但不会终止管道命令。
如果您知道结果在1秒后显示,那么对于解决方法,您可以在该时间之后使用timeout
杀死shell命令。例如:
timeout 1 tar -ztf /tmp/z.txz | grep -m1 '/packagesite.txz$'
答案 2 :(得分:-1)
是的,它无法按预期运行,根据我的发现并引用的grep
man
页仅适用于文件。
以下是man
页上的摘录:
-m NUM,--max-count = NUM
在NUM条匹配的行之后停止读取文件。如果输入是 来自常规文件的标准输入,NUM条匹配的行是 输出,grep确保将标准输入定位为 退出前的最后一条匹配行之后,无论 尾随上下文线的存在。这样可以进行呼叫过程 恢复搜索。当grep在NUM条匹配行之后停止时, 输出任何尾随的上下文行。当-c或--count 还使用了option,grep不会输出大于NUM的计数。 当还使用-v或--invert-match选项时,grep在之后停止 输出NUM条不匹配的行。