bash - 让 grep 在找到匹配项时提前退出

标签 bash grep

我在 bash 中有以下行。

(sleep 1 ; echo "foo" ; sleep 1 ; echo "bar" ; sleep 30) | nc localhost 2222 \
| grep -m1 "baz"

这会打印“baz”(如果/当 TCP 连接的另一端发送它时)并在 32 秒后退出。

我想让它做的是在看到“baz”时退出 sleep 30early。 -m 标志退出 grep,但不会终止整行。

我如何在 bash 中实现这一点(如果可能,不使用 expect)?


更新:当且仅当服务器尝试在 baz 之后发送内容时,上面的代码才会退出。这并不能解决这个问题,因为服务器可能会在几分钟内不发送任何内容。

最佳答案

如果您喜欢 Bash 深奥的一面,您可以为此使用 coproc

coproc { { sleep 1; echo "foo"; sleep 1; echo "bar"; sleep 30; } | nc localhost 2222; }
grep -m1 baz <&${COPROC[0]}
[[ $COPROC_PID ]] && kill $COPROC_PID

在这里,我们使用coproc来运行

{ { sleep 1; echo "foo"; sleep 1; echo "bar"; sleep 30; } | nc localhost 2222; }

在后台。 coproc 负责在 ${COPROC[0]}${COPROC[ 中设置的文件描述符中重定向此复合命令的标准输出和标准输入1]}。此外,此作业的PIDCOPROC_PID中。然后,我们将后台作业的标准输出提供给 grep。完成后很容易终止工作。

关于bash - 让 grep 在找到匹配项时提前退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26777283/

相关文章:

linux - 来自文件的 Zenity Bash 列表

html - 如何grep所有html页面中的所有外部链接

linux - Grep 查找以下划线开头和结尾的字符串

linux - 用于列表和 grep Bash 的两个 Onelinner For Cycle

linux - shell Linux : grep exact sentence with NULL character

linux - grep 从一个日期开始的所有内容并在一个日期停止

linux - bash 。读取符号之间的输入 "words"字符串

bash - 使用 bash 读取矩阵对角线上的元素并将其重定向到另一个文件

linux - Bash CSV 排序和唯一性

linux - 抑制 fork 命令被杀死的通知