Como extrair um valor entre uma cadeia de caracteres e imprimi-los? [RESOLVIDO]

1. Como extrair um valor entre uma cadeia de caracteres e imprimi-los? [RESOLVIDO]

Rogerio Vieira
roncelio

(usa Outra)

Enviado em 14/02/2016 - 13:47h

Olá galera, estou precisando de mais um help de vcs,

É o seguinte, eu tenho um arquivo com 100 mil linhas onde tenho que retirar desse arquivo apenas 3 informações. Eu consegui fazer o script trazer apenas as minhas informações usando a função -F"". porém gostaria de saber se tem outra forma de procurar um valor entre caracteres conforme uma linha do arquivo abaixo.

{0x00003118} 2016-01-13 21:45:42,667; INFO ; Flash::Constants::ReturnCode __cdecl Flash::FlashMessageHandler::handleFixMessage; Fix message has been sent (routed in 324 microseconds). ClOrdID(11)=00000002201601131230002000000024177 Destination Fix Gateway and session=SMPISO01.IN_SMPISO01_ALC_REP Correlated source message: MsgSeqNum(34)=24179, SenderCompID(49)=Q00000220, TransactionID=bb901c12-ba4f-11e5-80cc-001b215ac758

Onde preciso extrair os seguintes valores:
(routed in 324 microseconds)
ClOrdID(11)=00000002201601131230002000000024177 Destination

Resultado espoeradp = 324
Resultado espoeradp= 00000002201601131230002000000024177

Saída:
324;00000002201601131230002000000024177

Usando separador deu certo mas queria outra forma de fazer isso porque usando o separador meu script fica muito grande e a idéia é deixa-lo menor e também ampliar o conhecimento.

Segue o scrpt que fiz para esse arquivo:
awk '/Fix message has been sent/,/session=/' ./FlashBorda/FlashKernel.log* | awk '/Fix message has been sent/{if (x)print x;x="";}{x=(!x)?$0:x";"$0;}END{print x;}' | awk -F";" '{print $0 "@@" substr($1,13,24)}' | awk -F"routed in " '{print $2}' | awk -F" " '{print $0 "@@" $1}' | awk -F"ClOrdID" '{print $0 "@@" substr($2,6,35)}' | awk -F@@ '{print $2 ";" $3 ";" $4}' >> LogFlashborda.csv;

Desde já agradeço a atenção de todos,
Att,
Rogério Vieira


  


2. MELHOR RESPOSTA

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 14/02/2016 - 17:33h

Acho que assim róla (com hora,minuto, segundo, milissegundo + seua dados :
awk '/Fix message has been sent/,/session=/' FlashKernel.log | sed -r  's/.* (([0-9]+:){2}[0-9]+,[0-9]+).* ([0-9]+) micro.*=([0-9]+) Dest.*/\1;\3;\4/g' 


Uma vida sem desafios não vale a pena ser vivida.
Sócrates

---

3. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los?

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 14/02/2016 - 14:14h

Olá,

Assim acho que fica menor:
sed -r 's/.* ([0-9]+) micro.*=([0-9]+) Dest.*/\1;\2/g' arquivo.log 


abs
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---


4. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los? [RESOLVIDO]

Rogerio Vieira
roncelio

(usa Outra)

Enviado em 14/02/2016 - 15:22h

tonyhts escreveu:

Olá,

Assim acho que fica menor:
sed -r 's/.* ([0-9]+) micro.*=([0-9]+) Dest.*/\1;\2/g' arquivo.log 


abs
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---



Oi Alan,

É quase isso, se no meu arquivo tivesse todas as linhas iguais, esse comando resolveria. Só que eu tenho que colocar um padrão para limpar o arquivo deixando apenas as linhas que contenha o padrão e depois iniciar minha busca das informações que preciso, visto que usando o padrão consegui limpar as linhas que não me interessam. Quando executei esse comando ele trouce as informações que queria, porém ele trouce também as linhas que diferente da que fiz a busca.

Consigo usar esse script junto com o awk? ou colocar um padrão no comando sed conforme o padrão abaixo usado no awk para trazer apenas as linhas que contem as informações necessárias.
awk '/Fix message has been sent/,/session=/' ./FlashBorda/FlashKernel.log*

Ou seja como esses 2 scripts juntos resolveria minha dúvida desde que primeiro busque o padrão e depois os valores.

Gostaria muito que vc me explicasse esse código que vc montou, pois gostei muito e quero muito entende-lo pois vai me ajudar muito aqui no meu dia dia alem claro do awk que já estou dominando um pouco.

Muito agradecido.



5. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los?

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 14/02/2016 - 15:29h

Olá,

Alan Turing é o dono da frase que usava na assinatura, rsrsr eu sou Tony ;)

É possivel incrementar no sed. Ficaria assim:

sed -r '/Fix message has been sent/,/session=/ s/.* ([0-9]+) micro.*=([0-9]+) Dest.*/\1;\2/g' arquivo.log  


Veja se funciona. Se sim, posto a explicação do comando completo e funcional.

abs,


Uma vida sem desafios não vale a pena ser vivida.
Sócrates

---


6. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los? [RESOLVIDO]

Rogerio Vieira
roncelio

(usa Outra)

Enviado em 14/02/2016 - 15:46h

tonyhts escreveu:

Olá,

Alan Turing é o dono da frase que usava na assinatura, rsrsr eu sou Tony ;)

É possivel incrementar no sed. Ficaria assim:

sed -r '/Fix message has been sent/,/session=/ s/.* ([0-9]+) micro.*=([0-9]+) Dest.*/\1;\2/g' arquivo.log  


Veja se funciona. Se sim, posto a explicação do comando completo e funcional.

abs,


Uma vida sem desafios não vale a pena ser vivida.
Sócrates

---


kkkkkk Foi mal Tony pela troca de nomes,

Não funcionou, trouce as mesma informações do outro, pelo visto ele não conseguiu fazer o padrão que foi passado a ele.

Se vc quiser me passa o seu email que te mando um arquivo de exemplo. como aqui não tem como adicionar anexo.

Att,
Rogério




7. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los? [RESOLVIDO]

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 14/02/2016 - 15:50h

OK, tonyhts@hotmail.com


Uma vida sem desafios não vale a pena ser vivida.
Sócrates


---


8. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los? [RESOLVIDO]

Rogerio Vieira
roncelio

(usa Outra)

Enviado em 14/02/2016 - 16:08h

tonyhts escreveu:

OK, tonyhts@hotmail.com


Uma vida sem desafios não vale a pena ser vivida.
Sócrates


---


Tony, Email encaminhado..



9. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los?

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 14/02/2016 - 16:31h

Opa,

Agora acho que vai, rs

Tente assim:


awk '/Fix message has been sent/,/session=/ {print}' FlashKernel.log| sed -r 's/.* ([0-9]+) micro.*=([0-9]+) Dest.*/\1;\2/g'



Uma vida sem desafios não vale a pena ser vivida.
Sócrates

---


10. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los? [RESOLVIDO]

Rogerio Vieira
roncelio

(usa Outra)

Enviado em 14/02/2016 - 16:55h

tonyhts escreveu:

Opa,

Agora acho que vai, rs

Tente assim:


awk '/Fix message has been sent/,/session=/ {print}' FlashKernel.log| sed -r 's/.* ([0-9]+) micro.*=([0-9]+) Dest.*/\1;\2/g'



Uma vida sem desafios não vale a pena ser vivida.
Sócrates

---


Oi Tony,

Agora deu certo dessa forma, pior que eu tinha tentado feito dessa forma quando vc mandou o sed na primeiro resposta e por algum detalhe não tinha dado certo, mas agora funcionou graças a vc claro.

Agora só preciso que me explique esse comando e se tiver algum outro link ou documento que possa estudar e enter melhor esse comando sed que pelo visto é bem bacana e resolve com poucas linhas.

Vou tentar inserir no script para pegar o horário também.

Após sua explicação coloco como Resolvido.

Te desejo tudo de bom muito obrigado por compartilhar o conhecimento ,

Sucesso,
Att,
Rogério Vieira



11. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los?

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 14/02/2016 - 17:08h

Opa! que bom que deu certo.

Segue a explicação do sed:
sed -r 's/.* ([0-9]+) micro.*=([0-9]+) Dest.*/\1;\2/g' 

A sintaxe utilizada foi:
sed -r 's/isso/por isso/g'

sed -r : A opção -r ativa o recurso de expressões regulares extendidas - ( No nosso comando serviu apenas pra não ter que "escarparmos ( \ )" os carateres reservados.


s/ : Substituir

.* ([0-9]+) micro.*=([0-9]+) Dest.*/: Aqui é a parte isso: Não vou entrar em detalhes da expressão regular que utilizamos pois seria extremamente extenso, então vou resumir.
Fizemos o "match" da linha inteira, porém agrupamos as coisas de nosso interesse . No caso, podemos separar em partes:

.* qualquer caractere e em qualquer quantidade
([0-9]+) até encontrar um espaço seguido de um ou mais numeros somente se em seguida contenha a string micro. (Repare que os numeros encontrados foram agrupados pelo parenteses)
.* : qualquer caractere e em qualquer quantidade
=([0-9]+) até encontrar o caracter =(igual) seguido de um ou mais numeros. (Repare que os numeros encontrados foram agrupados pelo parenteses)

\1;\2/ : Essa é a parte por isso - No caso estamos indicando o grupo 1 seguido do carateres ;(ponto e virgula) seguido do grupo 2.

g :Global - Em todas as ocorrência encontradas.

Resumo: Sed, substitua a linha inteira pelos grupos identificados 1 e 2, separados por ponto e vírgula.

Uffa, acho que é isso ;)


Uma vida sem desafios não vale a pena ser vivida.
Sócrates

---


12. Re: Como extrair um valor entre uma cadeia de caracteres e imprimi-los?

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 14/02/2016 - 17:11h

Opa, agora que reparei no seu email, para acrescentar a hora. Segue:
awk '/Fix message has been sent/,/session=/' FlashKernel.log | sed -r  's/.* (([0-9]+:){2}).* ([0-9]+) micro.*=([0-9]+) Dest.*/\1\3;\4/g'


Abs,



Uma vida sem desafios não vale a pena ser vivida.
Sócrates

---



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts