如何在while循环中从grep执行命令?

时间:2019-03-25 10:13:47

标签: bash

如果找到与do匹配的内容,我需要执行grep命令。这是我所拥有的,但不起作用。

while 
tail -F /home/user/log/test.txt | stdbuf -o0 grep -E -A 1 'NDC003|FLC133' | stdbuf -o0 grep 'TO.W'; 
do
cat /home/user/test/turnon.sh | ssh pi@10.10.10.10 bash
done

即使grep返回匹配项,cat命令也不会运行。我需要运行该命令,并且需要tail -F才能继续监视日志文件中将来的模式匹配。我想念什么?

3 个答案:

答案 0 :(得分:0)

您使用tail -F来输送管道。因此,管道不会关闭(除非有人删除test.txt),因此您的抓地力不会终止。

答案 1 :(得分:0)

您可以按照以下方式尝试:

tail -f /home/user/log/test.txt  | while read line
do case "$line" in
        *"text_to_search"*) <do something>
         ;;
   esac
done

答案 2 :(得分:0)

使用这种结构,在while行中使用tail,对退出代码(在您的情况下为最后一个grep)仅进行一次测试。除非您遇到这种情况,否则该过程被阻止,因为tail -F从不退出。

您可以在while循环中使用类似于 时髦的答案或在我的解决方案中:

while read line
do
    ssh pi@10.10.10.10 "bash -s" < /home/user/test/turnon.sh "$line"
done < <(tail -F /home/user/log/test.txt | stdbuf -oL grep -E -A 1 'NDC003|FLC133' | stdbuf -oL grep 'TO.W')

您的建造过程中有几个困难。

  • while循环中包含流,因此我找到了解决方案:done < <( echo hello)
  • 命令tail -F等待下一行,因此您必须使用stdbuf -oL请求特殊缓冲。选项-oL表示一行一行;我认为它不能与选项-o0一起使用:没有缓冲。
  • 请其他读者注意:grep -E -A 1 'NDC003|FLC133'表示您使用扩展正则表达式(正在寻找NDC003或FLC133),并且在匹配模式之后多输出1行。
  • 对于每个匹配的行,都会启动ssh命令。该脚本是本地的,但是它将在远程主机上执行。 bash的命令是从stdin(bash -s)中读取的。
  • 我已将“ $ line”添加为脚本的参数列表。这是插图。请注意,在过程中不会保留参数的解析。