我尝试从Linux bash上的日志文件中grep文本。文本位于两个方括号内。bash在方括号内的grep文本
例如在:
32432423 jkhkjh [234] hkjh32 2342342
我在寻找234
。
通常应该找到它
\[(.*?)\]
但与
|grep \[(.*?)\]
什么是正确的方式做使用grep
我尝试从Linux bash上的日志文件中grep文本。文本位于两个方括号内。bash在方括号内的grep文本
例如在:
32432423 jkhkjh [234] hkjh32 2342342
我在寻找234
。
通常应该找到它
\[(.*?)\]
但与
|grep \[(.*?)\]
什么是正确的方式做使用grep
正则表达式搜索你可以寻找一个左括号并用\K
转义序列清除。然后,匹配的右括号:
$ grep -Po '\[\K[^]]*' <<< "32432423 jkhkjh [234] hkjh32 2342342"
234
注意您可以在-P
(Perl的正则表达式扩展)说忽略:
$ grep -o '\[.*]' <<< "32432423 jkhkjh [234] hkjh32 2342342"
[234]
然而,正如你看到的,这个打印托架也。这就是为什么让-P
执行后视和后照是有用的。
您还在您的正则表达式中提及?
。那么,正如你所知道的,*?
就是让正则表达式匹配以非贪婪的方式表现。让我们来看一个例子:
$ grep -Po '\[.*?]' <<< "32432423 jkhkjh [23]4] hkjh32 2342342"
[23]
$ grep -Po '\[.*]' <<< "32432423 jkhkjh [23]4] hkjh32 2342342"
[23]4]
随着.*?
,在[23]4]
它匹配[23]
。只有.*
,它匹配到最后]
因此得到[23]4]
。此行为仅适用于-P
选项。
优秀的答案,谢谢你的解释! – user3732793
[
有特殊含义既壳和grep
,所以需要引用它两次。反斜杠阻止grep
将它们视为括号表达式的一部分;引用整个事件可防止shell在将它传递到grep
之前尝试扩展正则表达式作为模式。
... | grep '\[(.*?)\]'
在你尝试,外壳剥离反斜杠之后,他们迫使外壳字面上对待他们,这是大约到... | grep '[(.*?)]'
。
我喜欢\\[[^]]*]
(这就是:\\[ [ ^] ]* ]
,即什么,但是向右方括号在方括号)在\\[.*]
,因为贪婪的:
$ grep -o \\[.*] <<<"[this] and that too]"
[this] and that too]
与
$ grep -o \\[[^]]*] <<<"[this] and that too]"
[this]
然后再次grep
不是一切的工具(毕竟它是g/re/p
)。如果你只是想有什么方括号里面,我会使用sed
为:
$ sed 's/.*\[\([^]]*\)].*/\1/' foo
234
即。 用括号中的内容替代所有内容... sies。
你不需要括号。或问号。 –
你是指那样的| grep \\ [。* \\]?没有为我工作的红帽linux – user3732793
当我试着'echo“32432423 jkhkjh [234] hkjh32 2342342”| grep'\ [。* \]''它似乎在我的Debian系统上正常工作。它匹配'[234]'部分。 –