Za pomocą grep -o
musisz dopasować dokładnie to, co chcesz wyodrębnić. Ponieważ nie chcesz wyodrębniać proto=
ciągu, nie powinieneś go dopasowywać.
Rozszerzone wyrażenie regularne, które pasowałoby do jednego tcp
lub udp
po którym następuje ukośnik i niepusty ciąg alfanumeryczny to
(tcp|udp)/[[:alnum:]]+
Zastosowanie tego do danych:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
Aby upewnić się, że robimy to tylko w wierszach rozpoczynających się od ciągu proto=
:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
Z sed
, usuwając wszystko przed pierwszym =
i po pierwszym pustym znaku:
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
Aby mieć pewność, że robimy to tylko w wierszach rozpoczynających się od łańcucha proto=
, możesz wstawić ten sam krok wstępnego przetwarzania grep
jak powyżej lub możesz użyć
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Tutaj pomijamy domyślne wyjście z -n
opcją, a następnie uruchamiamy podstawienia i wyraźny wydruk linii tylko wtedy, gdy linia pasuje ^proto=
.
Za awk
pomocą domyślnego separatora pól, a następnie podzielenie pierwszego pola =
i wydrukowanie jego drugiego bitu:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
Aby mieć pewność, że robimy to tylko w wierszach rozpoczynających się od łańcucha proto=
, możesz wstawić ten sam krok wstępnego przetwarzania grep
jak powyżej lub możesz użyć
awk '/^proto=/ { split($1, a, "="); print a[2] }' file