2015-12-15 98 views
2

文字:Linux命令提取文本

All rights reserved. ERROR: ORA-00257: archiver error. Connect internal only, error. SP2-0751: Unable to connect to oracle. Exiting SQL*Plus 

我想要的輸出:

ERROR: ORA-00257: archiver error. 

我的命令:

sed 's/.*\(ERROR:.*\.\).*/\1/' 

實際輸出:

ERROR: ORA-00257: archiver error. Connect internal only, error. SP2-0751: Unable to connect to oracle. 

我如何調整我的sed命令僅此顯示:

ERROR: ORA-00257: archiver error. 

回答

0

而不是採取後面加一個點的所有字符(.*),你倒是應該採取其次([^\.]*)「只是一個點的所有字符」點:

sed 's/.*\(ERROR:[^\.]*\.\).*/\1/' 
0

桑達默認使用貪婪的比賽,似乎SED不支持非貪婪的匹配,所以它會盡可能長地匹配。

您可以將括號中的.*\.更改爲[^.]*\.以匹配非點號字符,然後按照點,這應該表現得像非貪婪匹配。或者你可以使用一個功能更強大的正則表達式引擎如Perl:

perl -pe 's/.*(ERROR:.*?\.).*/\1/'

0

可以達到同樣的用sed

$ sed -r 's/.*(ERROR[^.]*\.).*/\1/' log 

ERROR: ORA-00257: archiver error.