仅打印块中出现特定值的 awk 块
Print only awk blocks where a specific value appears within the block
我有多个使用以下方法打印的 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>
仅打印 something="60" 的 TAG 块
Output.txt:
Before
<TAG>
#2
<InnerTAG something="60">Value2</InnerTAG>
</TAG>
After
目前,我的代码只打印 TAG 块,但我想 "filter" 只打印带有 something="60" 或什至内部值的 TAG 块。本质上,通过块内的任何值。
我该怎么做?
此外,如果有人除了以下 post 之外还有更详细的 awk 资源可以阅读,您也会得到一个赞和我的赞赏 :)
Is a /start/,/end/ range expression ever useful in awk?
干杯!
awk 来拯救
awk '/<TAG>/{f=1;c=0} f{d[c++]=[=10=]} /<\/TAG>/{f=0} /60/&&f{for(i in d)print d[i]}'
您可能需要更详细地指定您的模式匹配,这里我只是使用 60 作为概念证明。
我有多个使用以下方法打印的 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>
仅打印 something="60" 的 TAG 块
Output.txt:
Before
<TAG>
#2
<InnerTAG something="60">Value2</InnerTAG>
</TAG>
After
目前,我的代码只打印 TAG 块,但我想 "filter" 只打印带有 something="60" 或什至内部值的 TAG 块。本质上,通过块内的任何值。
我该怎么做?
此外,如果有人除了以下 post 之外还有更详细的 awk 资源可以阅读,您也会得到一个赞和我的赞赏 :) Is a /start/,/end/ range expression ever useful in awk?
干杯!
awk 来拯救
awk '/<TAG>/{f=1;c=0} f{d[c++]=[=10=]} /<\/TAG>/{f=0} /60/&&f{for(i in d)print d[i]}'
您可能需要更详细地指定您的模式匹配,这里我只是使用 60 作为概念证明。