shell脚本+匹配日志文件中的错误字

时间:2012-01-30 21:07:40

标签: shell sed awk ksh

请建议如何匹配仅在“]”char之后出现的ERROR字符串 通过awk或sed

   [Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found 

我的目标是计算仅在日志文件中的“]”字符后出现的所有ERROR单词

备注 - “]”和ERROR之间必须是一个或多个空格

5 个答案:

答案 0 :(得分:4)

  

我的目标是计算仅在“]之后出现的所有ERROR字词   日志文件中的字符

     

备注 - “]”和ERROR之间必须是一个或多个空格

那么你不需要像awk这样的核头,甚至是perl。 grep为你这样做:

 grep -Pc ']\s+ERROR' yourLogFile

小测试:

kent$  echo "[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found "|grep -Pc ']\s+ERROR'
1

答案 1 :(得分:0)

AWK:

awk -F"] " '/ERROR/{print $2}' inputfile

测试:

[jaypal:~] echo "[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found " | awk -F"] " '/ERROR/{print $2}'
ERROR file /etc/ghy.txt not found 

的Perl:

perl -pe 's/.*(?<=] )(.*)/$1/' inputfile

测试:

echo "[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found " | perl -pe 's/.*(?<=] )(.*)/$1/'
ERROR file /etc/ghy.txt not found 

数不。发生次数:

[jaypal:~/Temp] cat file
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found
[Mon Jan 30 21:14:01 IST 2012] ERROR file /etc/ghy.txt not found

[jaypal:~/Temp] awk -F"] " '/ERROR/{a[NR]=$2}END{print "count is " length(a)}' file
count is 9

答案 2 :(得分:0)

这是一个仅限shell的片段,它应该比使用任何外部程序(对于小文件读取)更快,因为它只使用shell内置函数。它可以被修改为在守护进程模式下运行时逐个处理错误(通过将日志文件拖到fifo而不是直接读取它并修改case条件)

不是echo的预期用途,但它 将空格/制表符减少到1个空格

FILE="logfile"
ERRORS=0
while read LINE || [ "$LINE" ]; do
    case "`echo $LINE`" in
        *\]" "ERROR*)ERRORS=$(($ERRORS+1));;
    esac
done < "${FILE}"
echo $ERRORS

答案 3 :(得分:0)

这可能对您有用:

grep -c '\] \+ERROR' file

grep -c '\][[:space:]]\+ERROR' file

或者

sed '/\]\s\+ERROR/!d' file | wc -l

答案 4 :(得分:-1)

你可以做到

sed -n '/] ERROR/p' infile