我需要编写一个遍历文件的脚本,并且如果出现以下模式:“错误:无法获取锁定”,则连续X次发送电子邮件。
我编写了一个文件扫描程序,如果发现该文件发送了一封电子邮件,请问我是否可以得到一些帮助来进行修改,使其仅在看到该模式后连续发出5次警报?
if grep -q ERROR: could not obtain lock "error.txt"; then
echo “check the server” | mail -s "5 consecutive errors" test@test.com
fi
我尝试使用uniq进行操作,但每次发生时它都会输出发生次数
cat error.file | awk '{print $1}' | uniq -c | grep 'ERROR' | awk '{print $1}'
2
5
下面是错误的内容。
ERROR
ERROR
12345
ERROR
ERROR
ERROR
ERROR
ERROR
仅当它连续找到5个连续匹配并且忽略5以下的任何内容时,我才需要它产生输出。
非常感谢。
答案 0 :(得分:0)
此脚本将在每次看到至少5个连续错误时发送邮件,因此如果连续5次连续发生ERROR,则该脚本可以发送多封邮件
awk '{if ($0 ~ /ERROR/){n_error+=1}else{n_error=0}}; n_error==5{system("echo \"check the server\" | mail -s \"5 consecutive errors\" test@test.com")}' error.txt
发送邮件后,这个退出:
awk '{if ($0 ~ /ERROR/){n_error+=1}else{n_error=0}}; n_error==5{system("echo \"check the server\" | mail -s \"5 consecutive errors\" test@test.com"); exit 0}' error.txt
答案 1 :(得分:0)
您可以做的是首先获取grep
匹配的所有行号并将它们存储在数组中。
接下来,定义一个计数器来计算连续命中的次数。
然后遍历数组并计算连续命中数。如果达到5,则发送电子邮件并退出循环。
不知道这是否是最有效的答案,但似乎效果很好。
#!/bin/bash
consecutiveHits=0
foo=( $(grep -n <Pattern> <File> | cut -f1 -d: | sort -u) )
prevNum=${foo[0]}
for i in "${foo[@]:1}"
do
if [ $i = $((prevNum+1)) ]
then
((consecutiveHits++))
else
consecutiveHits=0
fi
if [ $consecutiveHits = 5 ]
then
echo “check the server” | mail -s "5 consecutive errors" test@test.com
break
fi
prevNum=$i
done