इसके साथ 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