Cortar comando com palavra como delimitador

10

Existe algum comando de corte para cortar com base em uma palavra, por exemplo:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD. The task has terminated abnormally because of a program check. 16:08:27

Eu quero a saída como:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

Como abordar?

Anony
fonte
1
Qual palavra você quer dizer?
Cyrus
ABCD é a palavra que eu quero usar como delimitador. E também, este é um log e, como o ABCD, também estou tendo outras palavras-chave. Eu quero uma abordagem em geral
Anony

Respostas:

16

Eu sugiro:

awk -F 'ABCD' '{print $1 FS "."}' file

Resultado:

171212 16082784 6264 XXX xxxxxxxx A transação XXXXX encerra o ABCD.

FScontém seu delimitador "ABCD". "ABCD" é uma expressão regular.

Cyrus
fonte
4

awkpode fazer o trabalho se você fornecer -Fsinalizador com a palavra que deseja usar:

$ awk -F 'test'  '{print $1;print $2}'  <<<  "onetesttwotest"                                                            
one
two

No seu caso particular, isso seria:

$ awk -F 'ABCD' '{print $1,FS}' input.txt                                                                                
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend  ABCD

A julgar pelo seu exemplo, você está apenas tentando imprimir coisas para ABCDexcluir tudo, depois disso também é uma opção:

$ awk '{print substr($0,0,match($0,/ABCD/)+4);}' input.txt                                                               
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.
Sergiy Kolodyazhnyy
fonte
Eles também querem manter o 'ABCD'.
Yea..ABCD deve estar lá
anony
Eu sugiro awk '{print gensub(/(.*ABCD\.).*/,"\\1",1)}'.
dessert
2

grep solução:

grep -o '^.*ABCD\.' input.txt

A expressão regular corresponderá a cada linha que começa ^com qualquer caractere .repetido várias vezes *e termina com a sequência de caracteres ABCD.A barra invertida \escapa ao significado especial do ponto .no final.

A opção -oinformará o grepcomando para imprimir apenas as partes correspondentes (não vazias) de uma linha correspondente.

pa4080
fonte
2

cutpode executar esse trabalho. Não é baseado em uma palavra, mas é baseado em .delimitador.

Usar :

cut -f 1 -d '.' input.txt | xargs -I "%" echo %.

Resultado

rooney@bond-pc:~$ cat input.txt 
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD. The task has terminated abnormally because of a program check. 16:08:27
rooney@bond-pc:~$ 
rooney@bond-pc:~$ cut -f 1 -d '.' input.txt | xargs -I "%" echo %.
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

xargsé usado aqui apenas para acrescentar .no final da string ABCD.

Rooney
fonte
0

Estou enfrentando um problema semelhante aqui. O conteúdo do meu arquivo é assim

2020-03-31 00:15:07 CEST| "EE-ManagedThreadFactory-default-Thread-162" #14608149 daemon prio=5 os_prio=0 tid=0x0000000018000800 nid=0x567a waiting on condition [0x00007f3b07561000]
2020-03-31 00:15:07 CEST| "ForkJoinPool.commonPool-worker-6" #14521326 daemon prio=5 os_prio=0 tid=0x000000000ab85800 nid=0x6ea4 waiting on condition [0x00007f3b05844000]
2020-03-31 00:15:07 CEST| "EE-ManagedThreadFactory-default-Thread-161" #14350035 daemon prio=5 os_prio=0 tid=0x0000000003a4e000 nid=0x7f11 waiting on condition [0x00007f3b06652000]
2020-03-31 00:15:07 CEST| "EE-ManagedThreadFactory-default-Thread-160" #13654810 daemon prio=5 os_prio=0 tid=0x000000000dd52000 nid=0x1a17 waiting on condition [0x00007f3b0624e000]

Quero que o valor de tid seja impresso. Qualquer ajuda é apreciada.

obrigado

Selva Prasad
fonte