Extrai xmls de arquivos em ksh

0

Estou usando o código abaixo para extrair XML de solicitação de um arquivo de texto

Isso funciona quando as tags XML de solicitação estão em linhas separadas, mas falha quando a solicitação completa está em uma única linha. Alguém poderia me ajudar a lidar com isso?

Meu snippet de código

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

O arquivo de entrada tem textos como abaixo,

[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>
    
por Abhinav Singh 02.08.2016 / 22:55

2 respostas

1

Suposição:

  • O arquivo de entrada contém XML em linhas que não começam com [Thread .

Solução:

  • Remova as linhas que começam com [Thread .

Isso faz isso e também remove as linhas vazias:

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

Se a tag de início começar em algum lugar na linha [Thread , exclua tudo até < nessa linha:

sed -e 's/^\[Thread[^<]*//' -e '^$d' input.txt >output.xml
    
por 02.08.2016 / 23:42
0

Use duas regras diferentes para corresponder aos dois casos:

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

Se a linha corresponder a GetXyz e /GetXyz , imprima-a e continue com a próxima linha. Se a linha corresponder apenas a GetXyz , use-a como o início de um intervalo para imprimir.

    
por 05.08.2016 / 16:20

Tags