从文本文件中获取范围模式中的特定行

时间:2013-06-28 05:26:21

标签: regex perl sed awk pattern-matching

我正在尝试不同的场景,其中一个是获取以下两个字符串之间的文本。


代码:

Type of msg:          -in_full [+]
>date
>alr text
>ID_on_exit
AWXX-Ready to commit (96) msg type: (10)
**
Type of msg:          -in_full [+]
>date
>alr text
>ID_on_exit
AWXX-Ready to commit (98) msg type: (10)
**
Type of msg:          -in_full [+]
>date
>alr text
>ID_on_exit
AWXX-Ready to commit (96) msg type: (10)

我需要让所有事件具有相同的起始行和结束行。从msg的类型开始.......并以最后一行结束。

最后一个字符串必须位于该行的开头,以及第一个字符串。我说过,因为有些情况下AWXX代码出现在另一行的中间,我对这些代码不感兴趣。

我尝试过类似的东西,但我对awk并不是很好。

代码:

perl -lne '{if(/"Type of msg:          -in_full \[+\]"/){$#A=-1;$f=1;} if(/^AWXX-Ready to commit (98) msg type: (10)/ && ($f)){print join("\n",@A,$_);next}($f)?push(@A,$_):next;}' test6

我也尝试使用sed,但我的文件很大,我认为存在某种限制,因为它不适用于那些文件,但文件很少。

我们使用SED处理的文件大小是否有任何限制?现在我使用的是sed,它只适用于小文件,但不适用于我的100MB日志。

我也在使用以下内容:

awk '/^Type of msg:          -in_full \[+\]/{s=x}{s=s$0"\n"}/^AWXX-Ready to commit \(98\)/{print s}' test6

出于某种原因,它会显示所有文件,而不是我要查找的内容。 HELP !!

1 个答案:

答案 0 :(得分:2)

GNU代码

sed -n '/^Type of msg:\s\+-in_full.\[+\]/,/^AWXX-Ready to commit (96) msg type:/p' file

GNU代码

awk '/^Type of msg:[[:space:]]+-in_full.\[\+\]/,/^AWXX-Ready to commit \(96\) msg type:/' file