为什么你的表达不起作用

为什么你的表达不起作用

我需要 grep 这个时间范围:2020-04-27T20:29:27 - 2020-04-27T20:3x (any time after 30)

但是这个 grep 给了我一个无效的时间范围错误:

egrep MESSAGE_SENT company-runtime-cdrs*.log | grep '27T19:[29-30]' | wc -l
grep: Invalid range end
0

我怎样才能正确地做到这一点?

答案1

我想您正在尝试匹配分钟2930

为什么你的表达不起作用

[29-30]没有达到你想要的效果;这意味着

29或(从到范围内的任意字符3)或0

该范围确实无效,因为3位于9(*)之前。


怎么做

为了实现你想要的(即匹配2930),你可以(29|30)在正则表达式中使用,例如

grep MESSAGE_SENT company-runtime-cdrs*.log | grep '27T20:\(29\|30\)'

或者

egrep MESSAGE_SENT company-runtime-cdrs*.log | egrep '27T20:(29|30)'

(请注意,egrep需要更少的转义,以便更具可读性)

您的确切时间范围

我需要 grep 这个时间范围:2020-04-27T20:29:27 - 2020-04-27T20:3x (any time after 30)

这有点复杂:

grep MESSAGE_SENT company-runtime-cdrs*.log | grep '27T20:\(29:\(2[7-9]\|[3-5].\)\|3.:\)'

或者

egrep MESSAGE_SENT company-runtime-cdrs*.log | egrep '27T20:(29:(2[7-9]|[3-5].)|3.:..)'

进一步的建议

我建议使用类似的工具正则表达式测试/解释你的正则表达式。我也用它来检查我上面得出的结论

(*)正式来说,这是与语言环境相关的,但我还没有看到哪个语言环境不这样。

相关内容