[root@linux ~]# cat show-spans | grep Down
PRI span 1/0: In Alarm, Down, Active
PRI span 3/0: In Alarm, Down, Active
PRI span 4/0: In Alarm, Down, Active
[root@samba ~]# cat show-spans | grep -e 1 -e 2 | grep Down
PRI span 1/0: In Alarm, Down, Active
我想写别的状态
如果在使用grep命令电子邮件提醒时发现单词“Down”,或者不发送电子邮件
我正在使用ssmtp进行电子邮件提醒,如下所示
cat show-spans | grep -e 1 -e 2 | grep Down| mail -s "Test email alert" indiaxxx@gmail.com
我想把它作为脚本。请帮助。
答案 0 :(得分:0)
我可以很快看到至少3个选项。
显而易见的临时文件:
F=$(mktemp)
if cat show-spans | grep Down >"$F"; then
mail -s "Test email alert" indiaxxx@gmail.com <"$F"
fi
rm -f "$F"
缺点是它会创建一个临时文件。这完全没必要。
如果文字不长(我猜它不会),使用变量代替文件:
TEXT=$(cat show-spans | grep Down)
if [ -n "$TEXT" ]; then
printf "%s\n" "$TEXT" | mail -s "Test email alert" indiaxxx@gmail.com
fi
(或者if可以测试[ 0 = $? ]
; grep总是会在找到的时候打印一些东西,如果没找到则没有,所以测试非空输出或grep退出状态是等效的。
请注意,该命令替换会删除尾随空白区域,但除此之外它会保留所有字符(包括换行符),因此将使用多行。
printf
命令比echo
更可靠,因为echo
解释了一些转义序列,并且存在互不兼容的实现。 printf
仅解释第一个参数中的转义。
对于仍然没有临时文件的大输入:
cat show-spans | grep Down | {
if read FIRST; then
{
printf "%s\n" "$FIRST"
cat
} | mail -s "Test email alert" indiaxxx@gmail.com
fi
}
read
将尝试读取grep输出的第一行,如果成功,则重新打印,其余的通过cat直接复制到mail
。 read
应该是read -r
,以避免解释转义序列如果你的shell支持它。