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