Grepping pedaços de uma string para formar uma nova string

2

Estou analisando alguns arquivos de log e resolvi os erros. Cada linha é algo como isto:

CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4

Como posso pegar essa linha e ler algo assim?

CreateOrder: 2015-09-29 15:42:06: Error description
ScheduleOrder: 2015-09-29 15:42:06: Error description 2
ScheduleOrder: 2015-09-29 15:42:06: Error description 3
ShipOrder: 2015-09-29 15:42:06: Error description 4
    
por Matt 30.09.2015 / 17:33

4 respostas

5

Isso deve funcionar:

$ perl -pe 's/^(.+?)_.+?:(.+?),.*?\](.+?)\[.*/$1: $2:$3/' file 
CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4 

Explicação

  • perl -pe : o -p significa "imprimir todas as linhas depois de aplicar o script fornecido por -e "
  • s/^(.+?)_.+?:(.+?),.*?\](.+?)\[.*/$1: $2:$3/ : a expressão regular procura por tudo até o primeiro _ ( .+?_ ) e salva isso como $1 . Então, tudo até o primeiro : e tudo depois disso até a primeira vírgula ( .+?, ) é salvo como $2 . Em seguida, ele pula até o primeiro ] ( .*?\] ) e captura tudo depois disso até o primeiro [ ( .+?\[ ) como $ 3. Finalmente, também combina tudo até o final da linha. Tudo isso é substituído por $1: $2: $3 .
por 30.09.2015 / 18:11
6

com sed :

sed 's/^\([^_]*\)_[^:]*:\([^,]*\)[^]]*\]\([^[]*\).*/: :/'
  • ^\([^_]*\) corresponde ao início da linha ^ . Em seguida, a parte dentro dos parênteses \(...\) é salva na variável interna sed :
    • [^_]* corresponde a qualquer caractere que não seja um sublinhado _ zero ou mais vezes * .
  • [^:]* isto é seguido por qualquer caracter que não seja : .
  • \([^,]*\) novamente dentro de colchetes e salvo na variável : cada caractere até o , após a data.
  • A análise [^]]*\] continua até que ] apareça (antes da descrição do erro).
  • \([^[]*\) , em seguida, corresponde tudo até o próximo quadrado de abertura brachet [ e salve-o em .
  • : : agora substitui everyting pela saída formatada e pelos valores das variáveis , e .

A saída:

CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4 
    
por 30.09.2015 / 18:15
1

Outra maneira é remover padrões desnecessários do que permanecerem necessários

sed 's/_[^:]*:/: /;s/,[^]]*\]/:/;s/\[.*//'

Saídas:

CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4
    
por 30.09.2015 / 19:40
0

É difícil dizer o que você está procurando, já que a descrição do erro parece dizer Descrição do erro . Isso mantém o material identificador em torno dele:

sed 's/[_,][^:-]*:/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN

... que imprime ...

CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description [system]: Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 2 [system]: Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 3 [system]: Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 4 [system]: Method4

Eu não sei se isso é muito ou pouco, ou se está no caminho certo. Eu brinquei com o droping do box também.

sed 's/[_,[][^]:-]*[]:]/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN

... que imprime ...

CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description  : Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 2  : Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 3  : Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 4  : Method4

... que parece o tipo de coisa que eu gostaria de ver, talvez.

Este dropa completamente o bit Description , mas talvez ainda conte a mesma história? Tenha em mente que é difícil combinar com uma string que você diz que pode ser qualquer coisa e que não parece servir a nenhum propósito real. De qualquer forma, é divertido também.

sed 's/[_,][^-]*[^ ]:/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN
CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method4
    
por 30.09.2015 / 23:43