Bash 错误的尾部语法或grep命令?

Bash 错误的尾部语法或grep命令?,bash,Bash,我得到了以下代码: tail -fn0 /var/log/messages | \ while read line ; do echo "$line" | grep "test" if [ $? = 0 ] echo "Running information gathering" then etc...etc 它应该持续监视“/var/tmp/messages”文件中添加的行,如果其中一行包含单词“test”,

我得到了以下代码:

tail -fn0 /var/log/messages | \  
while read line ; do  
       echo "$line" | grep "test"  
       if [ $? = 0 ]  
       echo "Running information gathering"  
       then  
etc...etc  
它应该持续监视“/var/tmp/messages”文件中添加的行,如果其中一行包含单词“test”,则执行脚本的其余部分,完成后退出。
只要将任何行添加到消息文件中,它就会执行脚本的其余部分,而与行内容无关。我添加了echo命令,$line正确地包含了新的日志文件行。我已尝试将测试“$?=0”更改为“$?=1”,但没有任何区别。
谁能给我一个指针吗


感谢@TomFenech

在BASH中,您可以使用glob匹配并避免
grep

tail -fn0 /var/log/messages | 
while read -r line; do  
    if [[ "$line" == *test* ]]; then
       echo "Running information gathering"  
    fi  
done

PS:您可以使用
grep-q
来根据找到的成功匹配获得正确的退出状态。

我建议您不使用循环,只需使用grep就可以让事情简单得多:

tail -fn0 /var/log/messages | grep -q test
echo "Running information gathering"
# rest of script

grep-q
在第一个匹配后退出,因此一旦找到第一个匹配,脚本将继续执行。

$?
返回一个整数。整数比较是用
-eq
-ge
等来完成的,而不是
=
=[$?=0]
[$?-eq 0]
应该具有相同的结果,无论
$?
的值在未找到匹配项时返回非零。在这种情况下,我会使用
grep-q
使输出静音,提前退出,并显式请求退出代码,但无论如何这应该是可行的。@EtanReisner:是的,我犯了一个愚蠢的错误。谢谢,很好!我对{1..100}中的I使用
进行了测试;做回声$i>>a;睡眠1;在一个选项卡中完成了
,在另一个选项卡中完成了
tail-fn0a | grep-q5
,效果很好。谢谢,我也测试了它;)@Tom Fenech虽然上面的代码工作得很好,但后来它破坏了脚本,因为原来的$line信息现在丢失了,稍后会进行测试。我尝试了以下方法:
tail-fn0/var/log/messages | grep-q“CPU利用率”| grep-q“超过阈值”readlinefpc=$(echo$line | awk'END{print substr($8,1,1)})PIC=$(echo$line | awk'END{print substr 11,1)})echo FPC$FPC echo PIC$PIC
但它只是坐在那里,从不执行脚本的其余部分。@Andy这是因为
grep-q
不产生任何输出。一种选择是使用
grep-m1
,它在一次匹配后退出并打印输出,因此可以在链中进一步使用它。然而,老实说,看起来你可以用一个awk程序做你想做的事情。我认为这解决了最初规定的问题。如果你的要求真的不同,也许你应该问一个新问题。@Tom谢谢你的建议,Tom,你已经做了。