Como extrair o XML de uma entrada de log?

0

Estamos registrando mensagens XML em um sistema de recebimento de dados em nossos registros.

Estou tentando usar sed para extrair o XML da entrada de log, mas não tenho certeza exatamente como usá-lo.

Esta é uma entrada de registro típica:

2018-02-20T10:02:51.395Z|hostname1|user1||Application Name||10062|DEBUG|o.s.i.channel.DirectChannel||postSend (sent=true) on channel 'logger', message: GenericMessage [payload=<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>, headers={quote_format=FpML, id=f572ea65-91dd-a610-7976-5a1e97c16524, quote_message_id=b640bd90-1624-11e8-a904-bd3c0f5af83b_1519120971176, quote_data=Quote Rep, quote_transaction_originator=user1, timestamp=1519120971394}]

Como eu poderia remover a frente e o final da entrada de log do XML?

A saída de sed para a linha acima deve ser:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>

    
por Jose Chavez 20.02.2018 / 18:50

3 respostas

3

grep -o '<?xml.*</canonMessage>' /path/to/log deve fazer o truque.

A opção -o para grep informa apenas os dados de saída que correspondem à expressão regular fornecida. Felizmente, você está falando apenas sobre extrair (parcial) XML, não analisando .

    
por 20.02.2018 / 19:11
0

Eu obtive a saída acima mencionada usando o comando sed mencionado abaixo

sed  "s/.*payload=//g" input.xml | sed "s/,.*//g"

saída

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>
    
por 20.02.2018 / 19:09
0

Se você realmente quiser usar sed em vez de grep , você pode ter faz uma pesquisa & substitua e apenas imprima apenas se corresponder a algo:

sed -n 's%.*\(<?xml .*</canonMessage>\).*%%p' < input

Aqui estamos, por padrão, -n ot linhas de impressão, depois fazemos uma pesquisa e substituição do texto <?xml ...</canonMessage> ; o parêntese escapado em torno desse texto "captura" em espaços numerados. Ao adicionar greedy .* regex capturas antes e depois do texto XML desejado, podemos substituir a linha inteira pelo texto salvo em e depois imprimir a linha resultante.

Eu usei % para separar o texto da pesquisa e o texto substituto, porque o </canonMessage> tem o típico separador de barra. Se você gosta mais do separador de barra, basta escapar do que está tentando corresponder:

sed -n 's/.*\(<?xml .*<\/canonMessage>\).*//p' < input
    
por 20.02.2018 / 20:24