grep 的正则表达式

grep 的正则表达式

我这里有这个命令:

grep -B10 -A10 '14:14:50 {"channels":["/alerts/6979/new"],"data":"New alerts for unit 6979"}' mygateway.log

我不想搜索 14:14:50,而是希望将 50 替换为任何数字。所以我想用“。”表示正则表达式中的任何字符。然而,在编程语言中,您通常用 \abc.xyz\ 来表示正则表达式,其中“.”。可以是任何字符和任意数量的字符。但是当我使用“.”时在上面的 grep 字符串中,它没有给我任何返回值。

答案1

这里的问题是它.用来表示任何单身的特点。因此会与in.相匹配,但是由于没有任何内容可以与 相匹配,因此该行的其余部分将无法匹配。无论如何,因为您知道您正在寻找的是任何5500数字,你应该更具体地使用你的正则表达式。将任何数字与:

[0-9]\+

如果您知道该数字可以有一个可选的小数部分(小数点后),则可以使用以下内容:

[0-9]\+\(\.[0-9]\+\)?

如果您使用's (PCRE) 选项,+则应省略 和括号之前的反斜杠。grep-P

如果您确实计划使用该-P选项,您应该知道它不符合 POSIX 标准,并且可能不适用于所有平台。

答案2

您还可以使用该-P标志来启用 Perl 兼容的正则表达式并使用\d

grep -P -B10 -A10 '14:14:\d+ {"channels":["/alerts/6979/new"],"data":"New alerts for unit 6979"}' mygateway.log

您还可以通过减少限制来真正简化它(当然详细信息取决于您的输入数据,但这应该可行):

grep -P -B10 -A10 '14:14:\d+.*channels.*alerts/6979/new.*data.*New' mygateway.log

我假设如果该行与 和 都匹配,/alerts/6979/new/New其余部分不变。

相关内容