Como extrair dados XML de logs usando o script de shell Unix? [duplicado]

0

Minha pergunta não está relacionada ao Analisar XML para obter o valor do nó no script bash? Também não consigo instalar / usar qualquer analisador XML novo de acordo com a política da empresa. Isso precisa ser alcançado usando shell / perl / awk / sed

Vou tentar reformular minha pergunta:

1) Nós temos um arquivo process.log no qual temos muitos dados de texto e entre nós publicamos alguns dados XML.
2) Existem milhares de diferentes XML publicados nos logs junto com outros dados de texto. 3) Agora eu preciso selecionar apenas os arquivos XML que são publicados após o XML de saída: valor
4) Também o arquivo XML que deve ser selecionado e copiado para um novo arquivo deve ser o que corresponde ao valor na tag ALERTID . 5) O valor ALERTID será fornecido na entrada do script. Então no nosso caso mGMjhgHgffHhhFdH1u4 será fornecido na entrada e nós precisamos selecionar o arquivo XML completo publicado para este alertid. A tag inicial é de e a tag de finalização é
5) Então eu preciso selecionar o arquivo XML de saída relevante em um novo arquivo baseado em um determinado ALERTID para que ele possa ser reproduzido em diferentes ambientes.

Format of the log:

Info Jan 11 17:30:26.12122 The process is not responding to heartbeats
Debug Jan 11 17:30:26.12123  Incoming XML :<xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderReject</Alerttype>
<AlertID>ghghfsjUtYuu78T1</AlertID>
<Order>uusingas</Order>
<Quantity>1254</Quanity>
</Alert> (CreateInitEventHandler. C:356)
Debug Jan 11 17:30:26.12199 The process is going down with warnings
Debug Jan 11 17:30:26.148199 Outgoing XML: <xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderheld</Alerttype>
<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>
<Order>uwiofhdf</Order>
<Quantity>7651</Quanity>
</Alert>(CreateEventHandler. C:723)
Debug Jan 11 17:30:26.13214 The process has restarted and thread opened
Debug Jan 11 17:30:26.13215 The heartbeat is recieved from alertlistener process

Agora, o requisito é usar o AlertID na entrada, verificar o log do processo e extrair o XML de saída correspondente em um arquivo separado.

Usando o awk, consigo extrair todos os arquivos xml de saída, mas não sei como extrair aquele relacionado a um AlertID específico.

Por exemplo:

awk '/Outgoing/{p=1; s=$0} P & & /<\/Alert>/ {print $0 FS s; s="" ;p=0}p' 1.log>2.log
    
por abhishek chaudhry 12.01.2018 / 20:45

1 resposta

0

Um método que não é particularmente adequado à tarefa, mas deve funcionar, é este:

  • Remover LFs para que tudo apareça em uma única linha
  • Mas coloque um LF após </Alert> para que todos os XMLs estejam em uma linha própria
  • grep para o código desejado
  • imprima a linha e limpe-a

Isso se traduz em:

 tr -d "\r\n" < log_file \
 | sed -e 's/\<?xml/\n&/g' -e 's/\<\/Alert>/&\n/g' \
 | grep -F '<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>'

Você pode até canalizar o resultado para xmllint --format - para imprimi-lo bem.

    
por 12.01.2018 / 22:02

Tags