我有日志文件,行如下,
2022-05-21 23:59:59,2406,842,[75000000,074],passed
2022-05-21 23:59:59,2410,841,[750000,076],passed
2022-05-21 23:59:59,3002,892,[700000,78],passed
还有什么方法可以 grep吗75
?70
我已经尝试如下,但它不起作用。我也需要这些事件。
cat 20220521log|grep -E "2022-05-21 23|75" -C
更新:
每个日志都包含不同的时间戳和数字,如上所述。我需要根据我的模式检查每个文件中可以找到多少次出现。让我们以 20220521 日志文件为例,我需要检查包含多少行以 开头的数字字段75
。所有其他字段与以前相同。
2022-05-21 23:59:59,2406,842,[75000000,074],passed //should take as one occurence
2022-05-21 23:59:59,2406,842,[00000000,074],passed //should not consider
2022-05-21 23:59:59,2406,842,[754324000,074],passed //should take as one occurence.
答案1
不需要为此调用多个程序,perl(可能还有 awk/python/...)可以完成这一切:
perl -a -F'' -e 'BEGIN { print "status count\n" } $a = join "",(@F[30,31]); next unless ($a == 70 or $a == 75); $b{$a}++; END { for (keys %b) { print "$_ $b{$_}\n" } }' < 705361.log
(705361
是问题的ID,只是我在创建文件/目录以测试命令之前将它们放在这里时使用的约定)
答案2
如果您需要获取所有出现次数以及计数,您可以简单地执行以下操作:
grep '^2022-05-21.*\[75' logfilename | tee >(wc -l)
这将打印以2022-05-21
和 开头的[75
所有行。 (我假设每一行只有一个以括号开头的数字字段。)然后在输出的最后一行,它将打印计数(通过让 tee 发送要由 wc 计数的输出的重复项)。
如果每天都有自己的文件,您可以省略^2022-05-21.*
;如果您只需要计数而不需要行数,则可以删除| tee >(wc -l)
并仅使用grep -c
(小写 c)。
答案3
也许你想要类似的东西:
<your-file grep -Po '^\d\d\d\d-\d\d-\d\d \d\d(?=:\d\d:\d\d,\d+,\d+,\[75)' |
uniq -c
用于第四个字段以每小时开头的行计数[75
(假设行按时间顺序排列)。