regex模式找到一行,然后在该行中查找数字

regex模式找到一行,然后在该行中查找数字,regex,grep,Regex,Grep,您好,我有一些日志文件记录了软件的操作及其执行时间,在日志文件中的某个地方,我有一些行与此类似: 6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 7198ms 如果我做了grep“BuildStops.BuildStop.add收货人:”System\u 2013626.log 我可以得到所有的行,但我正在尝试创建一个模式,让我能够找到执行时间超过10000ms的行 请提供任何帮助简单: grep

您好,我有一些日志文件记录了软件的操作及其执行时间,在日志文件中的某个地方,我有一些行与此类似:

6/26/2013 6:56:43 AM -  >>> BuildStops.BuildStop.AddConsignee: 7198ms
如果我做了
grep“BuildStops.BuildStop.add收货人:”System\u 2013626.log

我可以得到所有的行,但我正在尝试创建一个模式,让我能够找到执行时间超过10000ms的行

请提供任何帮助

简单:

grep -E "BuildStops\.BuildStop\.AddConsignee: ([5-9][0-9]{3}|[0-9]{5})" System_2013626.log
仅当(至少)五位数字出现在该位置,或四位数字至少以
5
开头时,此选项才与该行匹配。此外,不要忘记避开文字点。

简单:

grep -E "BuildStops\.BuildStop\.AddConsignee: ([5-9][0-9]{3}|[0-9]{5})" System_2013626.log
仅当(至少)五位数字出现在该位置,或四位数字至少以
5
开头时,此选项才与该行匹配。另外,不要忘了转义文字点。

使用以下方法:

grep -E "BuildStops.BuildStop.AddConsignee: [[:digit:]]{5}" file
它查找5位数字,即模式编号>=10000

测验
所以我希望它更具活力,有时我想寻找更多 10000有时我想找4000多个

我们可以将4000定义为:
-
[4-9]
加上3位。
-至少5位数字

$ cat file
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 7198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 71998ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 3198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 17198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 171898ms
12345
$ grep -E "BuildStops.BuildStop.AddConsignee: ([4-9][[:digit:]]{3}|[[:digit:]]{5})" file
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 7198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 71998ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 17198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 171898ms
使用以下命令:

grep -E "BuildStops.BuildStop.AddConsignee: [[:digit:]]{5}" file
它查找5位数字,即模式编号>=10000

测验
所以我希望它更具活力,有时我想寻找更多 10000有时我想找4000多个

我们可以将4000定义为:
-
[4-9]
加上3位。
-至少5位数字

$ cat file
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 7198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 71998ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 3198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 17198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 171898ms
12345
$ grep -E "BuildStops.BuildStop.AddConsignee: ([4-9][[:digit:]]{3}|[[:digit:]]{5})" file
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 7198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 71998ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 17198ms
6/26/2013 6:56:43 AM - >>> BuildStops.BuildStop.AddConsignee: 171898ms
用GNU grep测试

grep -E "BuildStops.BuildStop.AddConsignee:.*[[:digit:]]{5,}ms"
用GNU grep测试

grep -E "BuildStops.BuildStop.AddConsignee:.*[[:digit:]]{5,}ms"

此图案可以匹配10000ms、10000ms等。它与9999毫秒不匹配

grep -E 'BuildStops.BuildStop.AddConsignee:[[:space:]]+[[:digit:]]{5,}ms'

此图案可以匹配10000ms、10000ms等。它与9999毫秒不匹配

grep -E 'BuildStops.BuildStop.AddConsignee:[[:space:]]+[[:digit:]]{5,}ms'
怎么样

^[1-9]([0-9]){4}
从数字1-9开始,然后是4个或更多数字0

所以

"BuildStops.BuildStop.AddConsignee: [1-9]([0-9]){4}"
怎么样

^[1-9]([0-9]){4}
从数字1-9开始,然后是4个或更多数字0

所以

"BuildStops.BuildStop.AddConsignee: [1-9]([0-9]){4}"
grep“BuildStops\.BuildStop\.add收货人:\+[1-9][0-9]\{4,\}ms”

空格后的
\+
与“至少一个”空格匹配。
[0-9]
后面的
\{4,\}
表示0和9之间的“至少4”位。

grep“BuildStops\.BuildStop\.add收货人:\+[1-9][0-9]\{4,\}ms


空格后的
\+
与“至少一个”空格匹配。
\{4,\}
后面的
[0-9]
表示0和9之间“至少有4”个数字。

awk
解决方案:

awk '/BuildStops\.BuildStop\.AddConsignee:/ && $NF+0>10000' System_2013626.log
  • $NF+0
    将在整数中计算执行时间,丢弃ms

    • awk
      解决方案:

      awk '/BuildStops\.BuildStop\.AddConsignee:/ && $NF+0>10000' System_2013626.log
      
      • $NF+0
        将在整数中计算执行时间,丢弃ms


      你能给我解释一下10000英镑以上的情况吗。我想你在这里所做的是,你在寻找5位数字,这意味着10000以上,但我扔了这个数字,使它更简单,它会根据情况而变化,所以我希望它更具活力,有时我想寻找10000以上,有时我想寻找4000以上,好吧!这很有挑战性。看看我更新的答案,我想现在应该解决了。小心,你需要限制你的选择范围。嗯,你是什么意思,@TimPietzcker?我对正则表达式比较陌生,看不出我的正则表达式有什么错误。哦,我明白了,@TimPietzcker,所以我认为
      ([4-9][[:digit:][]{3}.[[:digit:][]{5})
      可以做到:用括号括起来。我测试过了,它能工作,这是一种正确的方法吗?你能给我解释一下它是如何寻找10000以上的吗。我想你在这里所做的是,你在寻找5位数字,这意味着10000以上,但我扔了这个数字,使它更简单,它会根据情况而变化,所以我希望它更具活力,有时我想寻找10000以上,有时我想寻找4000以上,好吧!这很有挑战性。看看我更新的答案,我想现在应该解决了。小心,你需要限制你的选择范围。嗯,你是什么意思,@TimPietzcker?我对正则表达式比较陌生,看不出我的正则表达式有什么错误。哦,我明白了,@TimPietzcker,所以我认为
      ([4-9][[:digit:][]{3}.[[:digit:][]{5})
      可以做到:用括号括起来。我测试过了,它可以工作,这是正确的方法吗?有没有一种方法可以查找特定的数字,而不是查找5位数字(即10000或以上),但我也希望能够查找5000ms以上的内容,您不需要真正逃离“.”或空格,它工作得很好。谢谢@user2247823:如果没有反斜杠,点将匹配任何字符。在这种特殊情况下,这不太可能是个问题,但你应该总是直言不讳。我明白了。你我需要逃离这个空间,还是我应该这样做是为了安全?空间不是a,所以没有必要逃离它。有没有办法寻找一个特定的数字,而不是寻找5位数字(即10000或以上),但我也希望能够寻找5000毫秒以上的东西你真的不需要逃离“.”或空间,它很好用。谢谢@user2247823:如果没有反斜杠,点将匹配任何字符。在这种特殊情况下,这不太可能是个问题,但你应该总是直言不讳。我明白了。你知道我需要逃离这个空间,还是我应该这样做只是为了安全?空间不是一个,所以没有必要逃离它。