我在Linux上(有时也在AIX上),并且在文件夹中有一堆日志文件。我有一个grep命令,它将以如下格式过滤掉所有错误。
CreateOrder_hostname_tee.log:2015-09-29 15:42:06,715:ERROR :Thread-26_CreateOrder: [1443555726715] Error1 [system]: Class1
CreateOrder_hostname_tee.log:2015-09-29 15:42:06,715:ERROR :Thread-15_CreateOrder: [1443555726715] Error1 [system]: Class1
CreateOrder_hostname_tee.log:2015-09-29 15:42:06,715:ERROR :Thread-28_CreateOrder: [1443555726715] Error2 [system]: Class2
ScheduleOrder_hostname_tee.log:2015-09-30 03:55:05,011:ERROR :Thread-5_ScheduleOrder: [1443599705009] Error3 [system]: Class3
是否可以使用grep / awk / sed的某种组合以上述格式获取上述数据?
API: Error: Count
CreateOrder: Error1: 50
CreateOrder: Error2: 50
ScheduleOrder: Error3: 50
如果没有,是否有可能获得像这样的格式?然后,我可以使用wc或类似方法来计算不同的错误。
API: Date: Error
CreateOrder: 2015-09-29 15:42:06,715: Error1
CreateOrder: 2015-09-29 15:42:06,715: Error2
ScheduleOrder: 2015-09-29 15:42:06,715: Error3
编辑1:
该错误可能是任何字符串(包括空格)。基本上,应该显示在下面方括号之间的所有内容。
[1443555726715] Error1: This is an error with description. [system]: Class1
input=$(your grep command)
formatted=$(
echo "$input" |
sed 's/^\([^_]*\).*[0-9]*\] \([^[]*[^\[ ]\).*/\1: \2/'
)
kinds=$(echo "$formatted" | sort -u)
while IFS= read kind
do
count=$(echo "$formatted" | grep "$kind" | wc -l)
echo "$kind: $count"
done <<< "$kinds"
对于您问题中给出的输入,将给出以下输出:
CreateOrder: Error1: 2
CreateOrder: Error2: 1
ScheduleOrder: Error3: 1
一切都在内存中完成,因此对于非常大的数据结构(数十或数百兆字节)而言,这可能不可行。但是,在这些情况下,您可以使用临时文件,而不是shell变量(如echo "$input" | sed … > formatted.tmp
和sort -u formatted.tmp > kinds.tmp
等)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句