2014-03-03 58 views
0

我有一个xml文件。我需要在匹配的文本前打印五行。如果匹配,awk命令打印最后5行

可能有多个匹配项。我正在使用以下仅返回一行的awk命令。

awk '/<\/ABC>/' file.xml 

回报

<ABC>Some Text1</ABC> 
<ABC>Some Text2</ABC> 
<ABC>Some Text3</ABC> 

预计:

... previous 4 lines ... 
<ABC>Some Text1</ABC> 
... previous 4 lines ... 
<ABC>Some Text2</ABC> 
... previous 4 lines ... 
<ABC>Some Text3</ABC> 

无法使用grep -Bas per in Solaris

grep的:非法选项 - B的grep:非法选项 - 2用法:grep的-hblcnsviw图案文件

回答

1

这件怎么样?

awk '(NR>1){{a[NR]=$0;if($0~/<\/ABC>/){for(i=NR-4;i<=NR;i++){print a[i]}}}}' input.txt 
+0

它很好。但它不打印匹配的行。只打印前面的行 – logan

+1

更改的代码以打印匹配的行。 – chidori

+0

它也可以在linux机器上工作吗? – logan

4

对于Solaris:

nawk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=2 a=4 s="string" file1 

“B” - >数要在字符串“s”之前打印的行。

“a” - >字符串“s”后打印的行数。

的Linux:

grep -B4 '<ABC>' file.xml 
+2

请注意,它在Solaris中,'grep -B'不起作用。 – fedorqui

+0

@Amit:会在Linux中工作吗? – logan

+0

@logan不,但'awk'&'grep -B'可以在Linux上运行。 – Amit