对日志文件中的错误进行Grepping和分组

时间:2015-09-30 13:40:47

标签: linux unix awk sed grep

我在Linux上(有时在AIX上)并且在一个文件夹中有一堆日志文件。我有一个grep命令,它将按以下格式过滤掉所有的ERROR。

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

3 个答案:

答案 0 :(得分:2)

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.tmpsort -u formatted.tmp > kinds.tmp等)。

答案 1 :(得分:0)

以下是一个简单的bash脚本,您可以轻松添加新模式,用法是:

#!/bin/bash

PATTERN_1=(CreateOrder Error1)
PATTERN_2=(CreateOrder Error2)
PATTERN_3=(ScheduleOrder Error3)

function get_pattern_count {
    COUNT=$(grep -E ".+$1.+$2.+" $3 | wc -l)
    echo $1 " : " $2 : $COUNT
}

echo "API: Error: Count"
get_pattern_count ${PATTERN_1[0]} ${PATTERN_1[1]} $1
get_pattern_count ${PATTERN_2[0]} ${PATTERN_2[1]} $1
get_pattern_count ${PATTERN_3[0]} ${PATTERN_3[1]} $1

脚本代码:

{{1}}

答案 2 :(得分:0)

该解决方案按API字母顺序对输出进行排序 首先,它打印标题行
循环遍历每一行,它搜索/正则表达式/
如果找到,它将结果存储到散列
中 最后,它对哈希的键进行排序,并打印结果

perl -lane 'BEGIN{print "API: Error: Count"} if(/^([^_]+).*\]\s*(Error[^\[]+)\[/){$h{"$1: $2:"}++} END{for $k (sort keys %h){ print "$k $h{$k}"}}' log

输入:

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
ScheduleOrder_hostname_tee.log:2015-09-30 03:55:05,011:ERROR  :Thread-5_ScheduleOrder: [1443555726715] Error1: This is an error with description.  [system]: Class1

输出:

API: Error: Count
CreateOrder: Error1  : 2
CreateOrder: Error2  : 1
ScheduleOrder: Error1: This is an error with description.  : 1
ScheduleOrder: Error3  : 1