С 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