web-dev-qa-db-fra.com

Commande Cut avec Word comme délimiteur

Existe-t-il une commande de coupe à couper 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 en tant que:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

Comment aborder?

9
Anony

Je suggère:

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

Sortie:

 171212 16082784 6264 XXX xxxxxxxx Transaction XXXXX avec ABCD. 

FS contient votre délimiteur "ABCD". "ABCD" est une regex.

13
Cyrus

awk peut faire le travail si vous fournissez -F 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’à ABCD. Vous pouvez donc tout supprimer par la suite:

$ awk '{print substr($0,0,match($0,/ABCD/)+4);}' input.txt                                                               
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.
4
Sergiy Kolodyazhnyy

sed version:

sed 's/ABCD.*/ABCD./' input.txt
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

Source: https://unix.stackexchange.com/questions/257514/how-to-delete-everything-after-a-certain-pattern-or-a-string-in-a-file

4
user689314

grep solution:

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

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

L'option -o indiquera à la commande grep de n'imprimer que les parties correspondantes (non vides) d'une ligne correspondante.

2
pa4080

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

Utilisation :

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

sortie

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 est utilisé ici uniquement pour ajouter . à la fin de la chaîne ABCD.

2
Rooney