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?


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.


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.

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.