我在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
答案 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.tmp
和sort -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