如何 grep 查找“[numberLargerThan5000]ms”的出现?

如何 grep 查找“[numberLargerThan5000]ms”的出现?

我有一个 .log 文件,其中每个条目都在表单上

2018-09-28T10:53:48,006 [Jetty-6152  ] INFO  [correlationId] my.package.service:570 - Inbound request: 1.2.3.4 - GET - 12342ms - 200 - /json/some/resource
2018-09-28T11:53:48,006 [Jetty-6152  ] INFO  [correlationId] my.package.service:570 - Inbound request: 1.2.3.4 - GET - 204ms - 200 - /json/other/resource

如何查找请求时间超过 5 秒的所有条目?该条目包含文本“[numberGreaterThan5000]ms”?

答案1

我认为应该这样做:

grep -E '([5-9][0-9]{3}|[0-9]{5,})ms' | grep -v 5000ms

它是如何工作的?

  1. 它使用的-E正则表达式是“现代”格式(也称为扩展)。在我们的例子中,它只是使输入更容易,因为我们可以保存一些\字符。
  2. 搜索(...|...)ms后跟字符串 的两个替代项ms。这是必要的,因为正则表达式无法比较数字,所以我不能说类似的事情 >= 5000
  3. 第一种选择是[5-9][0-9]{3}匹配以 5 到 9 的数字开头,后跟 3 次出现的 0 到 9 的数字的任何字符串。这些都是 >= 5000 且 < 10000 的数字。
  4. 第二种选择将匹配 5 个或更多数字的字符串,即任何 >= 10000 的数字。
  5. 最后,我们将结果通过管道grep -v 5000ms过滤掉任何出现的情况,5000ms因为你说更大大于 5000。如果您想要大于或等于,请忽略该值。

哪里可以了解更多?

man 1 grepman 7 regex

答案2

一般来说,您应该避免尝试从正则表达式构建数字比较 - 使用类似awkperl的东西可以进行实际的数字比较,例如

gawk -v x=5000 'match($0,/([0-9]+)ms/,a) && a[1]+0 > x' file.log

或者

perl -ne 'print if /(\d+)ms/ && $1 > 5000' file.log

相关内容