bash:管道不断变成grep

时间:2017-08-24 16:50:42

标签: bash grep tail

不知道如何解释这个,但我想要实现的是:     - 拖尾文件并为图案A点击     - 然后我想管道到另一个customGrepFunction,它匹配模式B,如果B匹配echo out out。需要customGrepFunction才能执行其他自定义操作。

这里的粘性部分是如何使grepCustomFunction在这里工作。换句话说,当只有patternA匹配回显整行时以及当patterA& patternB匹配打印输出定制的东西: 当我只跑:

tail -f file.log | grep patternA

我可以看到pattenA行正在打印/拖尾但是当我添加customGrepFunction时没有任何反应。

tail -f file.log | grep patternA | customGrepFunction

customGrepFunction应该在我的bin文件夹中全局可用:

customGrepFunction(){

 if grep patternB 
  then
     echo "True"
  fi


 }  

我有这个设置,但它没有做我需要它做的事情,只有当我按Ctrl + C并退出拖尾时它才会回显。 我在这里缺少什么?

由于

1 个答案:

答案 0 :(得分:3)

出错了什么

代码: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