Za pomocą grep -omusisz 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 tcplub udppo 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 grepjak powyżej lub możesz użyć
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Tutaj pomijamy domyślne wyjście z -nopcją, a następnie uruchamiamy podstawienia i wyraźny wydruk linii tylko wtedy, gdy linia pasuje ^proto=.
Za awkpomocą 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 grepjak powyżej lub możesz użyć
awk '/^proto=/ { split($1, a, "="); print a[2] }' file