Mit grep -o
müssen Sie genau das finden, was Sie extrahieren möchten. Da Sie die proto=
Zeichenfolge nicht extrahieren möchten , sollten Sie sie nicht abgleichen.
Ein erweiterter regulärer Ausdruck, der entweder mit einem Schrägstrich oder einer nicht leeren alphanumerischen Zeichenfolge übereinstimmt tcp
oder darauf udp
folgt, lautet
(tcp|udp)/[[:alnum:]]+
Dies auf Ihre Daten anwenden:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
Um sicherzustellen, dass wir dies nur in Zeilen tun, die mit der Zeichenfolge beginnen proto=
:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
Mit sed
, alles vor dem ersten =
und nach dem ersten Leerzeichen entfernen :
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
Um sicherzustellen, dass wir dies nur in Zeilen tun, die mit der Zeichenfolge beginnen proto=
, können Sie denselben Vorverarbeitungsschritt grep
wie oben einfügen oder verwenden
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Hier unterdrücken wir die Standardausgabe mit der -n
Option und lösen dann die Ersetzungen und einen expliziten Ausdruck der Zeile nur dann aus, wenn die Zeile übereinstimmt ^proto=
.
Mit awk
den Standardfeldtrennzeichen verwendet wird , und dann die erste Feldaufspaltung auf , =
und Drucken des zweiten Stück davon:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
Um sicherzustellen, dass wir dies nur in Zeilen tun, die mit der Zeichenfolge beginnen proto=
, können Sie denselben Vorverarbeitungsschritt grep
wie oben einfügen oder verwenden
awk '/^proto=/ { split($1, a, "="); print a[2] }' file