从 ksh 中的文件中提取 xml

从 ksh 中的文件中提取 xml

我使用下面的代码从文本文件中提取请求 XML,

当请求 XML 标记位于单独的行中时,此方法有效,但当完整的请求位于单行中时,此方法失败。有人可以帮我处理吗?

我的代码片段

echo "Starting Log Extractor on $(date)"
i=0
Request_Tag=GetXyz

Start_Tag="<"$Request_Tag
End_Tag="<\/"$Request_Tag">"

sed -n "/${Start_Tag}/,/${End_Tag}/p" CmServer.log >ExtractedXmls.txt

exec < ExtractedXmls.txt
j=1
while read array[i]; 
do
    filename=GetXyz_$j.xml
    a=`echo ${array[$i]} | grep -e "$Start_Tag"`
    b=`echo ${array[$i]} | grep -e "$End_Tag"`

    LengthStart=$(expr length "$a")
    LengthEnd=$(expr length "$b")


    if [[ $LengthStart >0 ]]; then
    echo ${array[$i]} >> $filename

    elif [[ $LengthEnd >0 ]]; then
    echo ${array[$i]} >> $filename
    ((j=j+1))

    else
    echo ${array[$i]} >> $filename
    fi
done

输入文件包含如下文本,

[Thread-4]  08/02/2016 04:39:30:510 DEBUG clyde.q.msgdetail:trace:? - Got msg from queue in QServerImpl
<GetXyz><MsgProtocol>SCIP</MsgProtocol>...........</GetXyz>

[Thread-4]  08/02/2016 04:39:30:510 DEBUG clyde.q.msgdetail:trace:? - Got msg from queue in QServerImpl
<GetXyz>
<MsgProtocol>SCIP</MsgProtocol>
.
.
.
</GetXyz>

答案1

假设:

  • 输入文件在不以 开头的行中包含 XML [Thread

解决方案:

  • 删除以 开头的行[Thread

这可以做到这一点,并且还删除空行:

sed -e '/^\[Thread/d' -e '^$d' input.txt >output.xml

如果开始标记可能从该[Thread行的某个位置开始,请删除该行上直到 a 的所有内容<

sed -e 's/^\[Thread[^<]*//' -e '^$d' input.txt >output.xml

答案2

使用两种不同的规则来匹配这两种情况:

 sed -n '/GetXyz/{ /\/GetXyz/ {p;n} }; /GetXyz/, /\/GetXyz/p'

如果该行与 和 都匹配GetXyz,则/GetXyz打印它并继续下一行。如果该行仅匹配GetXyz,则将其用作打印间隔的开始。

相关内容