如何在 Linux 中使用特定格式进行 grep 并获取出现次数

如何在 Linux 中使用特定格式进行 grep 并获取出现次数

我有日志文件,行如下,

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吗7570我已经尝试如下,但它不起作用。我也需要这些事件。

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(假设行按时间顺序排列)。

答案4

代码:

cat 20220521log | (echo "status count" ; awk -F "," '{list[substr($4,2,2)]++} END {for(i in list){print i, list[i]}}') | column -nt

结果 :

结果

相关内容