仅打印块中出现特定值的awk块

时间:2015-09-03 14:17:05

标签: awk sh ksh

我有多个awk块,用以下方法打印:

awk '/<TAG>/ {print "Before"} 
     /<TAG>/,/<\/TAG>/ {print} 
     /<\/TAG>/ {print "After"}' ${LOG} > OUTPUT.txt;

在此阶段,存在输出不同数据的相同XML。我希望Output.txt只包含其中包含特定值的awk块。如果此值出现一次或多次,请打印该块。

示例:

输入:

<TAG>
    #1
    <InnerTAG something="50">Value</InnerTAG>
</TAG>
<TAG_Two>
    #2
    <InnerTAG something="60">Value2</InnerTAG>
</TAG_Two>
<TAG>
    #2
    <InnerTAG something="60">Value2</InnerTAG>
</TAG>

仅打印某些东西=“60”

的TAG块

Output.txt的:

Before
<TAG>
    #2
    <InnerTAG something="60">Value2</InnerTAG>
</TAG>
After

目前,我的代码只打印TAG块,但我想将其“过滤”为只有TAG块的东西=“60”,甚至是内部值。基本上,通过块内的任何值。

我将如何做到这一点?

此外,如果有人有更详细的资料来阅读关于awk的信息,除了下面的帖子,你还会得到一个upvote和我的赞赏:) Is a /start/,/end/ range expression ever useful in awk?

干杯!

1 个答案:

答案 0 :(得分:1)

要求救援

awk '/<TAG>/{f=1;c=0} f{d[c++]=$0} /<\/TAG>/{f=0} /60/&&f{for(i in d)print d[i]}'

您可能需要更详细地指定模式匹配,这里我只使用60作为概念证明。