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 tcp
ou serait udp
suivie 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 grep
que ci-dessus, ou vous pouvez utiliser
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Ici, nous supprimons la sortie par défaut avec l' -n
option, 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 grep
que ci-dessus, ou vous pouvez utiliser
awk '/^proto=/ { split($1, a, "="); print a[2] }' file