С grep -o
, вы должны будете точно соответствовать тому, что вы хотите извлечь. Поскольку вы не хотите извлекать proto=
строку, вам не следует сопоставлять ее.
Расширенное регулярное выражение, которое будет соответствовать tcp
или udp
после косой черты и некоторой непустой буквенно-цифровой строки:
(tcp|udp)/[[:alnum:]]+
Применяя это к вашим данным:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
Чтобы убедиться, что мы делаем это только в строках, начинающихся со строки proto=
:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
С помощью sed
удаления всего до первого =
и после первого пустого символа:
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
Чтобы убедиться, что мы делаем это только для строк, начинающихся со строки proto=
, вы можете вставить тот же шаг предварительной обработки, grep
как описано выше, или использовать
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Здесь мы подавляем вывод по умолчанию с помощью -n
опции, а затем мы запускаем подстановки и явный вывод строки, только если строка совпадает ^proto=
.
Используя awk
разделитель полей по умолчанию, а затем разделив первое поле =
и напечатав его второй бит:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
Чтобы убедиться, что мы делаем это только для строк, начинающихся со строки proto=
, вы можете вставить тот же шаг предварительной обработки, grep
как описано выше, или использовать
awk '/^proto=/ { split($1, a, "="); print a[2] }' file