Avec grep -o, vous devrez faire correspondre exactement ce que vous voulez extraire. Puisque vous ne voulez pas extraire la proto=chaîne, vous ne devez pas la faire correspondre.
Une expression régulière étendue qui correspondrait tcpou serait udpsuivie d'une barre oblique et d'une chaîne alphanumérique non vide est
(tcp|udp)/[[:alnum:]]+
Appliquer cela sur vos données:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
Pour vous assurer que nous ne le faisons que sur les lignes commençant par la chaîne proto=:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
Avec sed, tout supprimer avant le premier =et après le premier caractère vierge:
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
Pour vous assurer que nous ne le faisons que sur les lignes commençant par la chaîne proto=, vous pouvez insérer la même étape de prétraitement grepque ci-dessus, ou vous pouvez utiliser
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Ici, nous supprimons la sortie par défaut avec l' -noption, puis nous déclenchons les substitutions et une impression explicite de la ligne uniquement si la ligne correspond ^proto=.
Avec awk, en utilisant le séparateur de champs par défaut, puis en divisant le premier champ =et en imprimant le deuxième bit:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
Pour vous assurer que nous ne le faisons que sur les lignes commençant par la chaîne proto=, vous pouvez insérer la même étape de prétraitement grepque ci-dessus, ou vous pouvez utiliser
awk '/^proto=/ { split($1, a, "="); print a[2] }' file