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

10

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

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.

Как подойти?

Anony
источник
1
Какое слово вы имеете в виду?
Сайрус
ABCD - это слово, которое я хочу использовать в качестве разделителя. А также, это журнал, и, как и ABCD, у меня есть и другие ключевые слова. Я хочу подход в целом
Anony

Ответы:

16

Я предлагаю:

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

Вывод:

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

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

Кир
источник
4

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.
Сергей Колодяжный
источник
Они также хотят сохранить «ABCD».
Да ... ABCD должен быть там
Anony
Я предлагаю awk '{print gensub(/(.*ABCD\.).*/,"\\1",1)}'.
десерт
2

grep решение:

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

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

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

pa4080
источник
2

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.

Руни
источник