kshのファイルからxmlを抽出する

kshのファイルからxmlを抽出する

次のコードを使用して、テキストファイルから要求XMLを抽出しています。

この方法は、要求XMLタグが別々の行にある場合は機能しますが、要求全体が1行にある場合は失敗します。誰でもこの問題を解決するのに役立ちますか?

私のコードスニペット

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

2 つのケースを一致させるには、2 つの異なるルールを使用します。

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

行が両方とも一致する場合は、GetXyz印刷/GetXyzして次の行に進みます。その行がとのみ一致する場合は、GetXyzそれを印刷間隔の先頭として使用してください。

関連情報