bash: 管道连续进入 grep
bash: pipe continuously into a grep
不知道如何解释,但是,我想要实现的是:
- 拖尾文件并搜索模式 A
- 然后我想通过管道传输到另一个与模式 B 匹配的 customGrepFunction,如果 B 匹配则回显一些内容。需要 customGrepFunction 才能执行其他一些自定义操作。
这里棘手的部分是如何使 grepCustomFunction 工作 here.In 换句话说,当只有 patternA 匹配回显整行时,当 patterA 和 patternB 都匹配打印输出自定义内容时:
当我只有 运行:
tail -f file.log | grep patternA
我可以看到 pattenA 行 printed/tailed 但是当我添加 customGrepFunction 时没有任何反应。
tail -f file.log | grep patternA | customGrepFunction
并且 customGrepFunction 应该在我的 bin 文件夹中全局可用:
customGrepFunction(){
if grep patternB
then
echo "True"
fi
}
我有这个设置,但是它没有做我需要它做的事情,它只会在我执行 Ctrl+C 并退出拖尾时回显 True。
我在这里错过了什么?
谢谢
出了什么问题
代码:if grep patternB; then echo "true"; fi
...等待 grep patternB
退出,只有当来自 tail -f file.log | grep patternA
的输入达到 EOF 时才会发生。由于 tail -f
永远等待新内容,因此 永远不会 成为 EOF,因此您的 if
语句永远不会完成。
如何修复
不要在函数内部使用 grep
。相反,逐行处理内容并使用 bash 的原生正则表达式支持:
customGrepFunction() {
while IFS= read -r line; do
if [[ $line =~ patternB ]]; then
echo "True"
fi
done
}
接下来,确保 grep
没有缓冲内容(如果是,那么它只会以大块的形式写入您的代码,延迟到这样的块可用)。执行此操作的方法因实现而异,但使用 GNU grep,它看起来像:
tail -f file.log | grep --line-buffered patternA | customGrepFunction
不知道如何解释,但是,我想要实现的是: - 拖尾文件并搜索模式 A - 然后我想通过管道传输到另一个与模式 B 匹配的 customGrepFunction,如果 B 匹配则回显一些内容。需要 customGrepFunction 才能执行其他一些自定义操作。
这里棘手的部分是如何使 grepCustomFunction 工作 here.In 换句话说,当只有 patternA 匹配回显整行时,当 patterA 和 patternB 都匹配打印输出自定义内容时: 当我只有 运行:
tail -f file.log | grep patternA
我可以看到 pattenA 行 printed/tailed 但是当我添加 customGrepFunction 时没有任何反应。
tail -f file.log | grep patternA | customGrepFunction
并且 customGrepFunction 应该在我的 bin 文件夹中全局可用:
customGrepFunction(){
if grep patternB
then
echo "True"
fi
}
我有这个设置,但是它没有做我需要它做的事情,它只会在我执行 Ctrl+C 并退出拖尾时回显 True。 我在这里错过了什么?
谢谢
出了什么问题
代码:if grep patternB; then echo "true"; fi
...等待 grep patternB
退出,只有当来自 tail -f file.log | grep patternA
的输入达到 EOF 时才会发生。由于 tail -f
永远等待新内容,因此 永远不会 成为 EOF,因此您的 if
语句永远不会完成。
如何修复
不要在函数内部使用 grep
。相反,逐行处理内容并使用 bash 的原生正则表达式支持:
customGrepFunction() {
while IFS= read -r line; do
if [[ $line =~ patternB ]]; then
echo "True"
fi
done
}
接下来,确保 grep
没有缓冲内容(如果是,那么它只会以大块的形式写入您的代码,延迟到这样的块可用)。执行此操作的方法因实现而异,但使用 GNU grep,它看起来像:
tail -f file.log | grep --line-buffered patternA | customGrepFunction