2017-06-19 113 views
1

我有下面的代码,它不会发送grep输出到电子邮件,但它显示输出命令行。不知道我做错了运行bash命令后没有收到grep输出的邮件

sudo tail -f  /path/to/file | while read line ; do  
    egrep 'successfully started \[[0-9] out of [0-9]\] components|successfully started \[[0-9] out of [0-9]\] components'  
    if [ $? -eq 0 ]; then 
     (echo " RESTARTS"; echo; echo $line) | mail -s "RESTART" [email protected] 
    else 
     echo " FAILS" 
    fi 
done 

[更新]

还有一种办法,我想这样做,但它不会发送email..I只是确保我能摆脱循环,不会永远持续下去,因此这就是为什么我把尾巴而

while read line; do 

    echo "$line" | sudo tail -f /opt/bmc/ao/cdp/tomcat/logs/grid.log 

    if [ $(echo "$line" | grep -E 'successfully started \[[0-9] out of [0-9]\] components|successfully started \[[0-9] out of [0-9]\] components' | wc -l) -ne 0 ]; then 
     (echo "CDP RESTARTS"; echo; echo "$line") | mail -s "BAOCDP AUTO RESTART" [email protected] 

     break 
    fi 

done 
+0

取出(脚本 –

+0

OK,我会尝试的 –

+0

@RamanSailopal这将无法正常工作,只有'echo $ line'会被传送到'mail',而前两个回声会进入stdout – Aaron

回答

0

,你希望它在$line变量的内容合作grep无法猜测,你必须把它提供给下面的命令:

egrep 'successfully started \[[0-9] out of [0-9]\] components|successfully started \[[0-9] out of [0-9]\] components' <<< "$line" 

echo "$line" | egrep 'successfully started \[[0-9] out of [0-9]\] components|successfully started \[[0-9] out of [0-9]\] components' 

关于你的编辑,我会去用下面的代码:

sudo tail -f /opt/bmc/ao/cdp/tomcat/logs/grid.log | while read line; do 

    if $(echo "$line" | grep -E 'successfully started \[[0-9] out of [0-9]\] components|successfully started \[[0-9] out of [0-9]\] components'); then 
     (echo "CDP RESTARTS"; echo; echo "$line") | mail -s "BAOCDP AUTO RESTART" [email protected] 

     break 
    fi 

done 

除了放回了tail属于它的地方,我也简化了if的条件:grep将返回1当且仅​​当它匹配,因此它可以用作条件本身。

+0

谢谢,我会尝试使用$ line并再次运行脚本 –

+0

@H .Birdi另一点:它看起来像你的脚本将永远运行,为每一个不匹配正则表达式的新行显示“失败”,这听起来很糟糕。你可能想要一旦设置邮件就退出如果脚本只有在服务器启动之前才运行)或者删除'echo“FAIL”'(如果脚本永远在后台运行,发送每次服务器启动时都会收到邮件) – Aaron

+0

我有失败选项,因为如果它与启动的组件不匹配,那么它会说它失败......是否有另一种方法来执行此操作?邮件发送后我应该把EXIT 0? –