unix命令用于搜索文本和复制完整的XML

时间:2017-02-09 18:09:01

标签: unix awk sed grep

使用UNIX,

我的日志文件包含多个XML。我如何使用UNIX命令或脚本进行搜索,这样我就可以获得包含abc的所有XML?

例如,下面的日志文件包含4个XML。我想创建一个新文件,其中包含所有包含**<value>abc</value>**

的XML
<createR>            <----- this is starting tag of XML
<value>abc</value>   <----- search for this value
<val>xyz</val>
</createR>           <----- this is end tag of XML

<createR>
<value>123</value>
<val>xyz</val>
</createR>

<createR>
<value>abc</value>
<val>xyz</val>
</createR>

<createR>
<value>qpw</value>
<val>xyz</val>
</createR>

希望输入新文件

<createR>
<value>abc</value>
<val>xyz</val>
</createR>

<createR>
<value>abc</value>
<val>xyz</val>
</createR>

我正在尝试使用grep,但只获得2行非完整XML。 XML开始标记为<createR>,END标记为</createR>

可能会有变化,所有这些XML都可能会记录在一行中。

4 个答案:

答案 0 :(得分:2)

 awk 'BEGIN{RS=""; FS="\n"}/abc/{print $0 "\n"}' sample.csv      

使用\n作为字段分隔符和“”作为记录分隔符,它会将每个块视为一行,然后/abc/将检查每一行是否与abc模式匹配,如果匹配,则打印它出来了 输出:

<createR>
<value>abc</value>
<val>xyz</val>
</createR>

<createR>
<value>abc</value>
<val>xyz</val>
</createR>

答案 1 :(得分:1)

@fresher:尝试:

awk '/<\/createR>/{A="";if(P){print Q ORS $0};Q=P=""} /<createR>/{A=1} A{Q=Q?Q ORS $0:$0;if($0 ~ /<value>abc<\/value>/){P=1}}'   Input_file

如果它在完整的行中,你可以尝试一下。

 awk '/<\/createR>/{A="";if(P){print Q ORS $0};Q=P=""} /<createR>/{A=1} A{Q=Q?Q ORS $0:$0;if($0 ~ /<value>abc<\/value>/){P=1}}' RS=" "   Input_file

将很快添加说明。

编辑:如下所述是相同的解释。

awk 
'/<\/createR>/                ##### Searching for string "</createR>" here.
                              ##### If above condition is TRUE then execute all following statements.
{A="";                        ##### Nullify the variable A's value, will explain A's existence in next steps.
if(P){                        ##### If variable P's value exist then do following.
print Q ORS $0};              ##### print the value of variable Q then ORS(Output record separator) then $0(current line)'s values.
Q=P=""}                       ##### Nullifying the values of variables Q and P now.
/<createR>/                   ##### Searching for string "<createR>" here.
{A=1}                         ##### Set the value of variable A to 1.
A{                            ##### If variable A's value is 1 then do following.
Q=Q?Q ORS $0:$0;              ##### creating a variable named Q whose value will be appended with values of current lines with ORS.
if($0 ~ /<value>abc<\/value>/)##### checking if current line's value has abc in it as per OP's request. If yes then 
{P=1}                         ##### Set the variable named P's value to 1.
}' 

答案 2 :(得分:0)

如果您不需要:

$ awk -v RS= -v ORS='\n\n' '/abc/' file
<createR>            <----- this is starting tag of XML
<value>abc</value>   <----- search for this value
<val>xyz</val>
</createR>           <----- this is end tag of XML

<createR>
<value>abc</value>
<val>xyz</val>
</createR>

然后编辑您的问题以显示更具真实代表性的样本输入/输出,我们可以实际测试潜在的解决方案,以了解它是否有效。

答案 3 :(得分:0)

使用支持XML的工具来完成这样的工作:

 xmlstarlet sel -t -c "//value[text()='abc']/.." input.xml