从日志文件中计算具有匹配模式的行

时间:2013-01-10 19:53:50

标签: linux shell unix awk grep

我的abc.log包含以下条目(摘录):

...
INFO #my-service# #add# id=67986324423 isTrial=true
INFO #my-service# #add# id=43536343643 isTrial=false
INFO #my-service# #add# id=43634636365 isTrial=true
INFO #my-service# #add# id=67986324423 isTrial=true
INFO #my-service# #delete# id=43634636365 isTrial=true
INFO #my-service# #delete# id=56543435355 isTrial=false
...

我想计算具有#add#属性的唯一ID的行和&拥有isTrial=true

对于上面的代码段,输出应为2

任何人都可以告诉我linux命令,我可以对上面的日志文件运行吗?

4 个答案:

答案 0 :(得分:4)

仅使用awk

# Count unique line
$ awk '$3~"add"&&$5~"true"&&!u[$4]++{++c}END{print c}' file
2

# Print unique lines
$ awk '$3~"add"&&$5~"true"&&!u[$4]++' file
INFO #my-service# #add# id=67986324423 isTrial=true
INFO #my-service# #add# id=43634636365 isTrial=true

或只是sortgrep

$ sort -uk4,4 file | grep "#add#.*true" 
INFO #my-service# #add# id=67986324423 isTrial=true
INFO #my-service# #add# id=43634636365 isTrial=true

$ sort -uk4,4 file | grep -c "#add#.*true"
2

答案 1 :(得分:1)

这个单行给你结果2

awk -F'#add# id=' '$2~/true/{a[$2]}END{print length(a)}' abc.log

这个单行为您提供了两条独特的行

awk -F'#add# id=' '$2~/true/&&!a[$2]++' abc.log

答案 2 :(得分:0)

合并grepcutsortwc

grep '#add#.*isTrial=true$' /path/to/file | cut -f4 | sort -u | wc -l

根据自己的喜好自定义正则表达式(对它匹配的行更严格/更严格)。

cut -f4 -d' '如果您的分隔符是空格而不是制表符

答案 3 :(得分:-1)

这也很重要

grep "isTrial=true" abc.log | grep "#add#" | awk ' { print $4 }' | sort | uniq | wc -l