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