Befehl mit Wort als Trennzeichen ausschneiden

10

Gibt es einen Befehl zum Schneiden, der auf einem Wort basiert, z.

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

Ich möchte die Ausgabe als:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

Wie nähere ich mich?

Anony
quelle
1
Welches Wort meinst du?
Cyrus
ABCD ist das Wort, das ich als Trennzeichen verwenden möchte. Und auch dies ist ein Protokoll, und wie ABCD habe ich auch einige andere Schlüsselwörter. Ich möchte einen Ansatz im Allgemeinen
Anony

Antworten:

15

Ich schlage vor:

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

Ausgabe:

171212 16082784 6264 XXX xxxxxxxx Transaktion XXXXX ABCD abbrechen.

FSenthält Ihr Trennzeichen "ABCD". "ABCD" ist eine Regex.

Cyrus
quelle
4

awkkann die Arbeit erledigen, wenn Sie -Fflag mit dem Wort versehen, das Sie verwenden möchten:

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

In Ihrem speziellen Fall wäre das:

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

Nach Ihrem Beispiel zu urteilen, versuchen Sie nur, Inhalte zu drucken, um danach ABCDalles zu löschen. Dies ist auch eine Option:

$ awk '{print substr($0,0,match($0,/ABCD/)+4);}' input.txt                                                               
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.
Sergiy Kolodyazhnyy
quelle
Sie wollen auch das 'ABCD' behalten.
Ja ... ABCD muss da sein
Anony
Ich schlage vor awk '{print gensub(/(.*ABCD\.).*/,"\\1",1)}'.
Dessert
2

grep Lösung:

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

Der reguläre Ausdruck stimmt mit jeder Zeile überein, die ^mit einem beliebigen Zeichen beginnt, das .mehrmals wiederholt wird, *und mit der Zeichenfolge endet. ABCD.Der Backslash \entgeht der speziellen Bedeutung des Punkts .am Ende.

Die Option -oweist den grepBefehl an, nur die übereinstimmenden (nicht leeren) Teile einer übereinstimmenden Zeile zu drucken.

pa4080
quelle
2

cutkann diesen Job selbst ausführen. Nicht basierend auf einem Wort, sondern basierend auf einem .Trennzeichen.

Verwenden :

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

Ausgabe

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.

xargswird hier nur zum Anhängen .am Ende der Zeichenfolge verwendet ABCD.

Rooney
quelle