我嘗試從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]'部分。 –