यहां समस्या -F
के साथ नहीं है।
समस्या /pat/
का उपयोग है जब आप pat
एक चर होने के लिए चाहते हैं। यदि आप /pat/
कहते हैं, awk
इसे एक शाब्दिक "पेट" के रूप में समझता है, तो यह स्ट्रिंग "पेट" वाली उन पंक्तियों से मेल खाने का प्रयास करेगा।
आप एक चर के माध्यम से पैटर्न उपलब्ध कराना चाहते हैं, तो आप इस रूप में ~
उपयोग करने की आवश्यकता:
awk -v pat="$pattern" '$0 ~ pat'
सभी एक साथ, अपने कोड होना चाहिए:
awk -v pat="$pattern" -F ":" '$0~pat{print $1, $2, $3, $4 }' file
# ^^^^^^
एक देखें उदाहरण:
इस फ़ाइल को देखते हुए:
$ cat file
hello
this is a var
hello bye
चलो युक्त "हैलो" लाइनों के लिए देखो:
$ awk '/hello/' file
hello
hello bye
चलो अब "पैट", एक चर में निहित की तलाश की कोशिश करते हैं, जिस तरह से आप यह क्या कर रहे थे:
$ awk -v pat="hello" '/pat/' file
$ # NO MATCHES!
चलो अब $0 ~ pat
अभिव्यक्ति का उपयोग:
$ awk -v pat="hello" '$0~pat' file
hello # WE MATCH!
hello bye
बेशक, आप केवल एक फ़ील्ड से मेल खाने के लिए ऐसे अभिव्यक्तियों का उपयोग कर सकते हैं और awk -v pat="$pattern" '$2 ~ pat' file
और इसी तरह कह सकते हैं।
GNU Awk User's Guide → 3.1 How to Use Regular Expressions से:
जब एक regexp जैसे/foo स्लैश, में संलग्न है /, हम इसे एक regexp लगातार फोन, ज्यादा 5.27 की तरह एक अंकीय निरंतर और "foo" एक स्ट्रिंग निरंतर है।
और GNU Awk User's Guide → 3.6 Using Dynamic Regexps: '! ~'
एक '~' या ऑपरेटर के दाईं ओर स्थित एक regexp लगातार होने की जरूरत नहीं है (यानी, स्लेश के बीच वर्णों की एक स्ट्रिंग)। यह अभिव्यक्ति हो सकती है। आवश्यक होने पर अभिव्यक्ति का मूल्यांकन किया जाता है और एक स्ट्रिंग में परिवर्तित किया जाता है; स्ट्रिंग की सामग्री को फिर regexp के रूप में उपयोग किया जाता है। एक regexp इस तरह से गणना की एक गतिशील regexp या अभिकलन regexp कहा जाता है:
BEGIN { digits_regexp = "[[:digit:]]+" }
$0 ~ digits_regexp { print }
यह एक regexp कि एक या अधिक संख्याएं, और परीक्षण इनपुट रिकॉर्ड इस regexp से मेल खाता है कि क्या वर्णन करने digits_regexp सेट।
धन्यवाद देता है। –