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이를 인쇄 간격의 시작으로 사용하십시오.

관련 정보