
скажи у меня есть файл
#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+')