次のコードを使用して、テキストファイルから要求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
それを印刷間隔の先頭として使用してください。