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 tcp
ou a ela seria udp
seguida 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 grep
como acima, ou usar
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Aqui, suprimimos a saída padrão com a -n
opçã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 grep
como acima, ou usar
awk '/^proto=/ { split($1, a, "="); print a[2] }' file