shell脚本中的正则表达式

时间:2014-04-02 14:35:56

标签: regex shell

我正在尝试根据正则表达式搜索日志文件中的一行。当我使用下面的命令时,我得到了正确的输出。平台:Solaris,Shell:Bash

grep 14:[00-29]

O / P: 4月2日14:07:35 [192.168.162.117.113.169]

但是当我使用下面的命令时,我得到空白输出

grep 14:[00-29]:[00-59].

我错过了什么吗?

4 个答案:

答案 0 :(得分:1)

你的正则表达没有按照你的想法行事。它实际上在做的是get me 14:[ONE number that is 0, 0-2 or 9]:[ONE number that is 0, 0-5, or 9]。您应该将其更改为14:[0-9]|([0-2][0-9]):[0-9]|([0-5][0-9])

答案 1 :(得分:1)

[00-29]仅匹配字符0,1,2和9。

[00-59]仅匹配字符0,1,2,3,4,5和9。

[]构造创建字符类,而不是数字范围。

您可能需要grep -E 14:[0-2][0-9]

答案 2 :(得分:1)

您需要使用其他正则表达式。例如,这就是:

grep "14:[0-2][0-9]:[0-5][0-9]" file
          ^^^  ^^^   ^^^  ^^^
           |    |     |   any number
           |    |    from 0 to 5
 from 0 to 2   any number

见输出:

$ grep "14:[0-2][0-9]:[0-5][0-9]" file
Apr 02 14:07:35 [192.168.162.117.113.169] 

第一个匹配但随便:

$ grep 14:[00-29] file
Apr 02 14:07:35 [192.168.162.117.113.169]
          ^^
          | |
          | 7 is not matched
          [00-29] matches this 0

答案 3 :(得分:0)

这两个正则表达式:

14:[00-29]

14:[00-29]:[00-59]

不正确,例如它们与0 to 29的值不匹配。

对于00到59的范围,您可以使用:

\b(0[0-9]|[1-5][0-9])\b

范围为0到29:

\b(0[0-9]|[12][0-9])\b