Вырезать команду со словом в качестве разделителя

Есть ли какая-нибудь команда на обрезку, основанная на слове, например:

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

Я хочу вывод как:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

Как подойти?

5 ответов

Решение

Я предлагаю:

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

Выход:

171212 16082784 6264 XXX xxxxxxxx Транзакция XXXXX и ABCD.

FS содержит ваш разделитель "ABCD". "ABCD" является регулярным выражением.

sed версия:

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

Источник: https://unix.stackexchange.com/questions/257514/how-to-delete-everything-after-a-certain-pattern-or-a-string-in-a-file

awk может сделать работу, если вы предоставите -F пометьте словом, которое вы хотите использовать:

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

В вашем конкретном случае это будет:

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

Судя по вашему примеру, вы только пытаетесь напечатать материал до ABCD поэтому удаление всего после этого также является опцией:

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

cut может сам выполнить эту работу. Не на основе слова, но на основе . разделитель.

Используйте:

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

Выход

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 используется здесь только для добавления . в конце строки ABCD,

grep решение:

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

Регулярное выражение будет соответствовать каждой строке, которая начинается ^ с любым персонажем . повторное количество раз * и заканчивается строкой ABCD. Обратная косая черта \ ускользает от особого значения точки . в конце.

Опция -o скажет grep команда для печати только совпадающих (непустых) частей совпадающей строки.

Другие вопросы по тегам