다음 코드를 사용하여 텍스트 파일에서 요청 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
이를 인쇄 간격의 시작으로 사용하십시오.