Linux命令提取文本

时间:2015-12-15 15:43:43

标签: linux sed

文本:

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.

3 个答案:

答案 0 :(得分:0)

不要将所有字符(.*)后跟一个点,而应该取“除点之外的所有字符”([^\.]*)后跟一个点:

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

答案 1 :(得分:0)

Sed默认使用贪婪匹配,似乎sed不支持非贪婪匹配,所以它会尽可能长时间匹配。

您可以将括号中的.*\.更改为[^.]*\.以匹配非点字符然后跟随点,这应该表现得像非贪婪的匹配。或者您可以使用更强大的正则表达式引擎,如perl:

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

答案 2 :(得分:0)

您可以使用sed

实现相同目标
$ sed -r 's/.*(ERROR[^.]*\.).*/\1/' log

ERROR: ORA-00257: archiver error.