Với grep -o
, bạn sẽ phải khớp chính xác những gì bạn muốn giải nén. Vì bạn không muốn trích xuất proto=
chuỗi, bạn không nên khớp chuỗi đó.
Một biểu thức chính quy mở rộng sẽ khớp với tcp
hoặc udp
theo dấu gạch chéo và một chuỗi ký tự chữ và số không trống là
(tcp|udp)/[[:alnum:]]+
Áp dụng điều này trên dữ liệu của bạn:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
Để đảm bảo rằng chúng tôi chỉ làm điều này trên các dòng bắt đầu bằng chuỗi proto=
:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
Với sed
, xóa mọi thứ trước ký tự đầu tiên =
và sau ký tự trống đầu tiên:
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
Để đảm bảo rằng chúng tôi chỉ thực hiện điều này trên các dòng bắt đầu bằng chuỗi proto=
, bạn có thể chèn cùng một bước xử lý trước grep
như trên hoặc bạn có thể sử dụng
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Ở đây, chúng tôi triệt tiêu đầu ra mặc định bằng -n
tùy chọn, và sau đó chúng tôi kích hoạt các thay thế và một bản in rõ ràng của dòng chỉ khi dòng khớp ^proto=
.
Với awk
, bằng cách sử dụng dấu tách trường mặc định, sau đó tách trường đầu tiên trên =
và in bit thứ hai của nó:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
Để đảm bảo rằng chúng tôi chỉ thực hiện điều này trên các dòng bắt đầu bằng chuỗi proto=
, bạn có thể chèn cùng một bước xử lý trước grep
như trên hoặc bạn có thể sử dụng
awk '/^proto=/ { split($1, a, "="); print a[2] }' file