检查文件中连续模式的脚本

时间:2018-10-09 14:13:29

标签: linux bash error-handling

我需要编写一个遍历文件的脚本,并且如果出现以下模式:“错误:无法获取锁定”,则连续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以下的任何内容时,我才需要它产生输出。

非常感谢。

2 个答案:

答案 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