Com grep -o, você terá que corresponder exatamente ao que deseja extrair. Como você não deseja extrair a proto=sequência, não deve correspondê-la.
Uma expressão regular estendida que corresponderia a uma barra tcpou a ela seria udpseguida por uma barra e alguma sequência alfanumérica não vazia é
(tcp|udp)/[[:alnum:]]+
Aplicando isso aos seus dados:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
Para garantir que apenas façamos isso nas linhas que começam com a sequência proto=:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
Com sed, removendo tudo antes do primeiro =e depois do primeiro caractere em branco:
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
Para garantir que apenas façamos isso nas linhas que começam com a sequência proto=, você pode inserir a mesma etapa de pré-processamento grepcomo acima, ou usar
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Aqui, suprimimos a saída padrão com a -nopção e, em seguida, acionamos as substituições e uma impressão explícita da linha somente se a linha corresponder^proto= .
Com awk, usando o separador de campo padrão e, em seguida, divida o primeiro campo =e imprima o segundo bit:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
Para garantir que apenas façamos isso nas linhas que começam com a sequência proto=, você pode inserir a mesma etapa de pré-processamento grepcomo acima, ou usar
awk '/^proto=/ { split($1, a, "="); print a[2] }' file