İle grep -o, ayıklamak istediğinizle tam olarak eşleşmeniz gerekir. Dizeyi ayıklamak istemediğiniz için proto=dizeyle eşleşmemelisiniz.
Bir eğik çizgi ve bazı boş olmayan alfasayısal dizeyle eşleşecek tcpveya udpbunları izleyecek genişletilmiş normal bir ifade
(tcp|udp)/[[:alnum:]]+
Bunu verilerinize uygulama:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
Bunu yalnızca dizeyle başlayan satırlarda yaptığımızdan emin olmak için proto=:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
İle sed, =ilk boş karakterden önce ve ilk boş karakterden sonra her şeyi kaldırmak :
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
Bunu yalnızca dizeyle başlayan satırlarda yaptığımızdan emin olmak için yukarıdaki proto=ile aynı ön işleme adımını ekleyebilir grepveya
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Burada, varsayılan çıktıyı -nseçenekle bastırırız ve sonra ikameleri ve satırın açık bir baskısını yalnızca çizgi eşleşirse tetikleriz^proto= .
İle awk, varsayılan alan ayırıcısını kullanarak ve ardından ilk alanı bölüp =ikinci bitini yazdırın:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
Bunu yalnızca dizeyle başlayan satırlarda yaptığımızdan emin olmak için yukarıdaki proto=ile aynı ön işleme adımını ekleyebilir grepveya
awk '/^proto=/ { split($1, a, "="); print a[2] }' file