2016-09-09 141 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