我这里有这个命令:
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.
相匹配,但是由于没有任何内容可以与 相匹配,因此该行的其余部分将无法匹配。无论如何,因为您知道您正在寻找的是任何5
50
0
数字,你应该更具体地使用你的正则表达式。将任何数字与:
[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
其余部分不变。