使用UNIX,
我的日志文件包含多个XML。我如何使用UNIX命令或脚本进行搜索,这样我就可以获得包含abc的所有XML?
例如,下面的日志文件包含4个XML。我想创建一个新文件,其中包含所有包含**<value>abc</value>**
<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都可能会记录在一行中。
答案 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