Wytnij polecenie słowem jako separatorem

10

Czy istnieje jakieś polecenie cięcia do wycięcia na podstawie słowa, np .:

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

Chcę wynik jako:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

Jak podejść?

Anony
źródło
1
Jakie masz na myśli słowo?
Cyrus,
ABCD to słowo, którego chcę użyć jako separatora. Jest to także dziennik i podobnie jak ABCD mam też inne słowa kluczowe. Chcę ogólnie podejście
Anony

Odpowiedzi:

16

Sugeruję:

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

Wynik:

171212 16082784 6264 XXX xxxxxxxx Transakcja XXXXX abend ABCD.

FSzawiera separator „ABCD”. „ABCD” to wyrażenie regularne.

Cyrus
źródło
4

awkmoże wykonać zadanie, jeśli podasz -Fflagę ze słowem, którego chcesz użyć:

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

W twoim szczególnym przypadku byłoby to:

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

Sądząc z twojego przykładu, próbujesz tylko wydrukować rzeczy, ABCDwięc usunięcie wszystkiego po tym jest również opcją:

$ awk '{print substr($0,0,match($0,/ABCD/)+4);}' input.txt                                                               
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.
Sergiy Kolodyazhnyy
źródło
Chcą także zachować „ABCD”.
Tak ... ABCD musi tam być
Anony,
Sugeruję awk '{print gensub(/(.*ABCD\.).*/,"\\1",1)}'.
deser
2

grep rozwiązanie:

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

Wyrażenie regularne będzie pasować do każdej linii, która zaczyna ^się dowolnym znakiem .powtarzanym wielokrotnie *i kończy się łańcuchem ABCD.. Odwrotny ukośnik nie \ma specjalnego znaczenia kropki .na końcu.

Ta opcja -ospowoduje, że greppolecenie wydrukuje tylko pasujące (niepuste) części pasującej linii.

pa4080
źródło
2

cutmoże sama wykonać tę pracę. Nie na podstawie słowa, ale na podstawie .ogranicznika.

Posługiwać się :

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

Wynik

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.

xargssłuży tutaj tylko do dołączania .na końcu łańcucha ABCD.

Rooney
źródło