Commande de coupe avec mot comme délimiteur

10

Existe-t-il une commande de coupure basée sur un mot, par exemple:

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

Je veux la sortie comme:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

Comment aborder?

Anony
la source
1
De quel mot parlez-vous?
Cyrus
ABCD est le mot que je veux utiliser comme délimiteur. Et aussi, c'est un journal, et comme ABCD, j'ai aussi d'autres mots-clés. Je veux une approche en général
Anony

Réponses:

16

Je suggère:

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

Production:

171212 16082784 6264 XXX xxxxxxxx Transaction XXXXX abend ABCD.

FScontient votre délimiteur "ABCD". "ABCD" est une expression régulière.

Cyrus
la source
4

awkpeut faire le travail si vous fournissez un -Fdrapeau avec le mot que vous souhaitez utiliser:

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

Dans votre cas particulier, ce serait:

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

À en juger par votre exemple, vous essayez uniquement d'imprimer des éléments jusqu'à ABCDce que tout supprimer après cela soit également une option:

$ awk '{print substr($0,0,match($0,/ABCD/)+4);}' input.txt                                                               
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.
Sergiy Kolodyazhnyy
la source
Ils veulent également conserver le «ABCD».
Yea..ABCD doit être là
Anony
Je suggère awk '{print gensub(/(.*ABCD\.).*/,"\\1",1)}'.
dessert
2

grep Solution:

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

L'expression régulière correspondra à chaque ligne commençant ^par un caractère .répété plusieurs fois *et se terminant par la chaîne. ABCD.La barre oblique inverse \échappe à la signification spéciale du point .à la fin.

L'option -oindiquera à la grepcommande d'imprimer uniquement les parties correspondantes (non vides) d'une ligne correspondante.

pa4080
la source
2

cutpeut lui-même effectuer ce travail. Pas basé sur un mot, mais basé sur un .délimiteur.

Utilisation :

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

Production

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.

xargsest utilisé ici uniquement pour ajouter .à la fin de la chaîne ABCD.

Rooney
la source