ด้วยgrep -o
คุณจะต้องตรงกับสิ่งที่คุณต้องการแยก เนื่องจากคุณไม่ต้องการแยกproto=
สตริงคุณไม่ควรจับคู่ให้ตรงกัน
นิพจน์ปกติที่ขยายซึ่งจะจับคู่กับtcp
หรือudp
ตามด้วยเครื่องหมายสแลชและสตริงตัวอักษรผสมตัวเลขที่ไม่ว่างเปล่าคือ
(tcp|udp)/[[:alnum:]]+
ใช้สิ่งนี้กับข้อมูลของคุณ:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
เพื่อให้แน่ใจว่าเราจะทำเช่นนี้กับบรรทัดที่ขึ้นต้นด้วยสตริงproto=
:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
ด้วยsed
การลบทุกอย่างก่อน=
อักขระตัวแรกและหลังอักขระตัวแรก:
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
เพื่อให้แน่ใจว่าเราจะทำสิ่งนี้ในบรรทัดที่ขึ้นต้นด้วยสตริงproto=
คุณสามารถแทรกขั้นตอนก่อนการประมวลผลเดียวกันกับgrep
ข้างต้นหรือคุณสามารถใช้
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
ที่นี่เราปราบปรามออกเริ่มต้นที่มีตัวเลือกและจากนั้นเราเรียกแทนและการพิมพ์อย่างชัดเจนของเส้นเฉพาะในกรณีที่ตรงกับสาย-n
^proto=
ด้วยawk
โดยใช้ตัวคั่นฟิลด์เริ่มต้นจากนั้นแยกฟิลด์แรกบน=
และพิมพ์บิตที่สองของมัน:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
เพื่อให้แน่ใจว่าเราจะทำสิ่งนี้ในบรรทัดที่ขึ้นต้นด้วยสตริงproto=
คุณสามารถแทรกขั้นตอนก่อนการประมวลผลเดียวกันกับgrep
ข้างต้นหรือคุณสามารถใช้
awk '/^proto=/ { split($1, a, "="); print a[2] }' file