我需要 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
我想您正在尝试匹配分钟29
和30
。
为什么你的表达不起作用
[29-30]
没有达到你想要的效果;这意味着
2
9
或(从到范围内的任意字符3
)或0
。
该范围确实无效,因为3
位于9
(*)之前。
怎么做
为了实现你想要的(即匹配29
和30
),你可以(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.:..)'
进一步的建议
我建议使用类似的工具正则表达式测试/解释你的正则表达式。我也用它来检查我上面得出的结论。
(*)正式来说,这是与语言环境相关的,但我还没有看到哪个语言环境不这样。