2016-09-09 118 views
2

我尝试从Linux bash上的日志文件中grep文本。文本位于两个方括号内。bash在方括号内的grep文本

例如在:

32432423 jkhkjh [234] hkjh32 2342342 

我在寻找234

通常应该找到它

\[(.*?)\] 

但与

|grep \[(.*?)\] 

什么是正确的方式做使用grep

+0

你不需要括号。或问号。 –

+0

你是指那样的| grep \\ [。* \\]?没有为我工作的红帽linux – user3732793

+0

当我试着'echo“32432423 jkhkjh [234] hkjh32 2342342”| grep'\ [。* \]''它似乎在我的Debian系统上正常工作。它匹配'[234]'部分。 –

回答

4

正则表达式搜索你可以寻找一个左括号并用\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选项。

+1

优秀的答案,谢谢你的解释! – user3732793

1

[有特殊含义既壳grep,所以需要引用它两次。反斜杠阻止grep将它们视为括号表达式的一部分;引用整个事件可防止shell在将它传递到grep之前尝试扩展正则表达式作为模式。

... | grep '\[(.*?)\]' 

在你尝试,外壳剥离反斜杠之后,他们迫使外壳字面上对待他们,这是大约到... | grep '[(.*?)]'

0

我喜欢\\[[^]]*](这就是:\\[ [ ^] ]* ],即什么,但是向右方括号在方括号)在\\[.*],因为贪婪的:

$ 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