在awk的每次迭代之间插入值

在awk的每次迭代之间插入值,awk,sh,ksh,Awk,Sh,Ksh,我正在解析一个日志文件,其中加载了多种类型的XML。我使用awk提取XML的特定部分。我正在使用以下工具: awk '/<TAG>/,/<\/TAG>/' ${LOG} > OUTPUT.txt; awk'/',/'${LOG}>OUTPUT.txt; 但是,由于这些是内部标记,而不是整个XML的开始或结束(因为有多种类型的XML),我需要在底部添加初始标记和结束标记(为了完成日志,因为顶部和底部标记对于所有类型的XML都是通用的,我需要一种特定

我正在解析一个日志文件,其中加载了多种类型的XML。我使用awk提取XML的特定部分。我正在使用以下工具:

        awk '/<TAG>/,/<\/TAG>/' ${LOG} > OUTPUT.txt;
awk'/',/'${LOG}>OUTPUT.txt;
但是,由于这些是内部标记,而不是整个XML的开始或结束(因为有多种类型的XML),我需要在底部添加初始标记和结束标记(为了完成日志,因为顶部和底部标记对于所有类型的XML都是通用的,我需要一种特定的类型)

问题是:

有没有办法在每次awk迭代前后添加文本

例如:

输入:

<TAG>
    <InnerTAG>
    </InnerTAG>
</TAG>
<TAGTWO>
    <InnerTAG>
    </InnerTAG>
</TAGTWO>
<TAG>
    <InnerTAG>
    </InnerTAG>
</TAG>

输出:

TOP
<TAG>
    <InnerTAG>
    </InnerTAG>
</TAG>
BOTTOM
TOP
<TAG>
    <InnerTAG>
    </InnerTAG>
</TAG>
BOTTOM
顶部
底部
顶部
底部
顶部和底部是两个不同的打印或我添加的东西

PS:我没有办法知道有多少迭代提前。。。这也是每个文件的动态特性

谢谢,

试试类似的东西

awk '/<TAG>/ {print "Before"} 
     /<TAG>/,/<\/TAG>/ {print} 
     /<\/TAG>/ {print "After"}' ${LOG} > OUTPUT.txt;
awk'/{print“在“}
//,//{print}
//{print“在“}”${LOG}>OUTPUT.txt之后;
用你想要的任何东西替换“Before”和“After”

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

替换“之前”和“之后”您可以随意使用。

请参阅,了解有关范围语法为何不那么有用的讨论,并查看一个更有用的等效脚本,它应该让您在此处轻松完成所需操作。我很困惑-您是在文本中所述的
..
周围添加文本,还是在示例中所示的
..
周围添加文本还是与
有关?请编辑您的问题,使其精确,并显示可测试的样本输入和预期的输出。您的结束标记不正确。@EtanReisner我会尽快查看它。让我们看看它是否有帮助:)关于范围语法为什么没有那么有用的讨论,以及查看一个更有用的等效脚本,它应该让您在这里不费吹灰之力就能完成您想要做的事情。我很困惑-您是想在
周围添加文本,还是像示例中所示的
这与
有关吗?请编辑您的问题,使其精确,并显示可测试的样本输入和预期的输出。您的结束标记不正确。@EtanReisner我会尽快查看它。让我们看看它是否有帮助:)不要使用范围表达式,因为当问题变得稍微有趣时,它们要求您复制条件,如本答案所示。只要用一面旗子就行了。@EdMorton你能详细说明一下吗?@toth你提供的答案有一半有效。。。它确实在上面和下面打印,但打印的是空行…@GalAppelbaum,如果我给它指定的输入,我会准确地得到指定的输出(如果将“Before”更改为“TOP”,将“After”更改为“BOTTOM”),我不理解这个问题。@GalAppelbaum注意,在这个解决方案中,
/
/
的条件出现在两个地方。任何时候你必须在软件中复制硬编码的值,你就是在写坏的软件,因为如果你以后需要更改这些值,你需要多次这样做,因此如果你错过了一个值,它会很耗时,并且容易被破坏。另请参见。切勿使用范围表达式,因为当问题变得稍微有趣时,它们要求您复制条件,如本答案所示。只要用一面旗子就行了。@EdMorton你能详细说明一下吗?@toth你提供的答案有一半有效。。。它确实在上面和下面打印,但打印的是空行…@GalAppelbaum,如果我给它指定的输入,我会准确地得到指定的输出(如果将“Before”更改为“TOP”,将“After”更改为“BOTTOM”),我不理解这个问题。@GalAppelbaum注意,在这个解决方案中,
/
/
的条件出现在两个地方。任何时候你必须在软件中复制硬编码的值,你就是在写坏的软件,因为如果你以后需要更改这些值,你需要多次这样做,因此如果你错过了一个值,它会很耗时,并且容易被破坏。另见。