2016-09-08 5 views
6

मैं सबस्ट्रिंग जहां निश्चित पैटर्न पाइप अलग फ़ाइल से मौजूद निकालना चाहते हैं, इस प्रकार मैं, आदेश नीचे इस्तेमाल कियाअजीब में एक चर में दिए गए पैटर्न से कैसे मिलान करें?

awk -F ":" '/REWARD REQ. SERVER HEADERS/{print $1, $2, $3, $4}' sample_profile.txt 

यहाँ, 'पुरस्कार अनुरोध। सर्वर हेडर 'एक पैटर्न है जिसे फ़ाइल में खोजा जाना है, और कोलन से अलग लाइन पर अपने पहले 4 भागों को प्रिंट करना है।

अब, मैं एक पैटर्न के रूप में कार्य करने के लिए बैश चर भेजना चाहता हूं। इस प्रकार मैंने कमांड का इस्तेमाल किया, लेकिन यह काम नहीं कर रहा है।

awk -v pat="$pattern" -F ":" '/pat/{print $1, $2 , $3, $4 } sample_profile.txt 

मैं -v और एक एकल awk आदेश में -F का उपयोग कैसे कर सकते हैं?

उत्तर

15

यहां समस्या -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 सेट।

+1

धन्यवाद देता है। –

4
awk -v pat="$pattern" -F":" '$0 ~ pat { print $1, $2, $3, $4 }' sample_profile.txt 

आप regex // अंकन अंदर चर का उपयोग नहीं कर सकते हैं (वहाँ pat के लिए खोज से अलग करने के कोई रास्ता नहीं है); आपको यह निर्दिष्ट करना होगा कि चर ~ (मिलान करने वाला) ऑपरेटर के साथ एक रेगेक्स है।

+0

यह काम कर रहा है। बहुत बहुत धन्यवाद, आपने मेरे घंटों को बचाया। –

0

यह एक हैक की तरह है लेकिन यह मेरे लिए चीजों को थोड़ा आसान बनाता है।

cmd="awk '/$pattern/'" 
eval $cmd 

बना स्ट्रिंग पहली बार आप अतीत awk की सीमाओं यह हेरफेर मेरी गलती ओर इशारा करते हुए के लिए और विस्तार विवरण के लिए

संबंधित मुद्दे