我有一个 .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
它是如何工作的?
- 它使用的
-E
正则表达式是“现代”格式(也称为扩展)。在我们的例子中,它只是使输入更容易,因为我们可以保存一些\
字符。 - 搜索
(...|...)ms
后跟字符串 的两个替代项ms
。这是必要的,因为正则表达式无法比较数字,所以我不能说类似的事情>= 5000
。 - 第一种选择是
[5-9][0-9]{3}
匹配以 5 到 9 的数字开头,后跟 3 次出现的 0 到 9 的数字的任何字符串。这些都是 >= 5000 且 < 10000 的数字。 - 第二种选择将匹配 5 个或更多数字的字符串,即任何 >= 10000 的数字。
- 最后,我们将结果通过管道
grep -v 5000ms
过滤掉任何出现的情况,5000ms
因为你说更大大于 5000。如果您想要大于或等于,请忽略该值。
哪里可以了解更多?
读man 1 grep
和man 7 regex
。
答案2
一般来说,您应该避免尝试从正则表达式构建数字比较 - 使用类似awk
或perl
的东西可以进行实际的数字比较,例如
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