grep для содержимого ПОСЛЕ шаблона в разделителе

grep для содержимого ПОСЛЕ шаблона в разделителе

скажи у меня есть файл

#cat file.log
abc|123|text1 modesc=bpp123 raw_info=clear
abc|123|text2 modesc=pmk123 severity=minor
abc|123|text3 modesc=pnj123 info=good

хочу только знать, какие слова в печатном $3 появляются после "modesc=" до пробела,

Я бы предпочел, чтобы вывод этой команды выглядел так:

abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Используя bash, я хотел бы просто вывести, где $3 просто получает слово после "modesc=". Есть ли способ сделать это?

решение1

$ sed 's/[^|]*modesc=\([^ ]*\).*$/\1/' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Используется sedдля замены всего последнего поля содержимым до modesc=следующего пробела.


$ awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3)} 1' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Эта awkпрограмма изменяет третий столбец двумя подстановками. Первая удаляет все до и включая modesc=, а вторая удаляет все после первого оставшегося пробела. Одинокий 1в конце приведет awkк печати измененной записи (ее можно заменить на { print }).


Ктолькополучить строку после modesc=третьего столбца исходных данных (и ничего больше), вы можете использовать любую из приведенных выше команд, а затем передать ее через cut -d '|' -f3, или вы можете использовать

sed 's/.*modesc=\([^ ]*\).*$/\1/' file

или

awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3); print $3 }' file

решение2

С помощью awkразделителей можно использовать несколько и сделать это довольно просто:

awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log

В строке выше разделителями являются |знак «эквивалент» =и пробел .

Вы можете явно определить разделитель вывода следующим образом:

awk -F'[|= ]' 'BEGIN { OFS="|"}  {print $1,$2,$5}' /tmp/file.log

решение3

С использованием awk:

awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*) .*$/,"\\1","g",$3)}' /tmp/file.log

решение4

Это будет менее эффективно, но задача хорошо вписывается cutвpaste

paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')

Связанный контент