वहाँ कमांड लाइन के माध्यम से awk var सेट करने के 2 तरीके हैं?


10

मैंने ओ'रिली awkउदाहरण (1997) को देखा, जिसने प्रोग्राम-टेक्स्ट के बाद कमांड लाइन पर इसे सेट करके एक अजीब चर सौंपा । यह काम करता है, लेकिन मैं इस वाक्यविन्यास को आदमी / जानकारी awk में नहीं खोज सकता । क्या मैंने इसे याद किया है; क्या यह समाप्त हो गया है ...? मैंने केवल मैनुअल में जो सिंटैक्स देखा है वह -vविकल्प है।

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

आउटपुट: cat dog

जवाबों:


11

यह वास्तव में POSIX में है awk(POSIX 2008 के लिए लिंक, पिछले संस्करणों में यह भी मुझे विश्वास था)। विकल्प अनुभाग -vमें वर्णित है , दूसरा तरीका ऑपरेंड्स अनुभाग में है।

-vफ़ाइल नामों के साथ अंत में असाइनमेंट पास करने और पास करने में अंतर है :

  • के साथ -v:

आवेदन यह सुनिश्चित करेगा कि असाइनमेंट तर्क एक असाइनमेंट ऑपरेंड के रूप में उसी रूप में है। निर्दिष्ट चर असाइनमेंट BEGIN पैटर्न (यदि कोई हो) से जुड़े कार्यों सहित, awk प्रोग्राम को निष्पादित करने से पहले होगा । इस विकल्प की कई घटनाओं को निर्दिष्ट किया जा सकता है।

  • फ़ाइल नामों के साथ मिश्रित:

[...] इस तरह के प्रत्येक चर असाइनमेंट निम्न फ़ाइल के प्रसंस्करण से पहले होगा , यदि कोई हो। इस प्रकार, BEGIN क्रियाओं (यदि कोई हो) के बाद पहली फ़ाइल तर्क से पहले एक असाइनमेंट निष्पादित किया जाएगा, जबकि अंतिम फ़ाइल तर्क के बाद एक असाइनमेंट END कार्रवाई (यदि कोई हो) से पहले होगा। यदि कोई फ़ाइल तर्क नहीं हैं, तो मानक इनपुट को संसाधित करने से पहले असाइनमेंट निष्पादित किए जाएंगे।

उदाहरण:

$ cat input 
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four

वाह! यह कुछ दिलचस्प नियंत्रण बिंदु जोड़ता है ... यह काम में आने के लिए बाध्य है। धन्यवाद ...
पीटर।

1
मेरा प्रारंभिक "वाह!" अभी भी पकड़ है, लेकिन यह कुछ हद तक ऐरजेज के जवाब में देख कर गुस्सा हो गया है ... मैंने इसे "var = तीन" नाम की एक वास्तविक फ़ाइल के साथ परीक्षण किया ... awkइसे एक चर असाइनमेंट होने की पूर्वता दी ... यह एक प्रमुख कोरोलेरी है , अर्थात। में सभी मामलों जब एक फ़ाइल नाम इस फार्म है, यह ध्यान नहीं दिया जाएगा और चर का गठन किया जाएगा ... ऐसा लगता है कि एक ही रास्ता इस टकराव से बचने के लिए वर्तमान कार्यशील निर्देशिका के लिए सुनिश्चित करना है कि फ़ाइल-नामों से है हमेशा चाहिए उपसर्ग होना उनके रिश्तेदार पथ के साथ:./var=three
पीटर।

@ पीटर.ओ, हाँ, यह भी उन कारणों के बीच है जो -vवाक्यविन्यास पेश किए गए थे। आपको -vसिंटैक्स को असाइनमेंट करने का पसंदीदा तरीका समझना चाहिए , आगे जाकर।
डबियसजिम

@ पीटर.ओ, " गोचा " के बारे में उत्कृष्ट बिंदु यदि एक फ़ाइलनाम एक वैध चर असाइनमेंट है। यदि आप एक शेल वैरिएबल का उपयोग कर रहे हैं, जिसमें एक फ़ाइल नाम है और एक तर्क के रूप में awk, आप निम्नलिखित कैच का उपयोग कर सकते हैं:[ "$myfile" == "${myfile#/}" ] && myfile="./$myfile"
वाइल्डकार्ड

4

यह बाहरी रूप से चर सेट करने की एक पुरानी शैली है awk। यह अस्पष्ट था (यदि आपके पास नाम का एक फ़ाइल नाम था foo=cat), तो बाद के संस्करणों ने एक -vविकल्प जोड़ा । यह शायद पिछड़े-अनुकूलता के लिए काम करना चाहिए, लेकिन आप गारंटी नहीं दे सकते। और जैसा कि मैंने कहा, -vविकल्प नया है, इसलिए सभी संस्करण awkइसका समर्थन नहीं कर सकते।


फ़ाइल-नाम के टकराव की संभावना पर आपकी टिप्पणी अच्छी है ... मैंने इसका परीक्षण किया है और यह निश्चित रूप से एक समस्या है। मैंने मैट के उत्तर के लिए एक टिप्पणी में इस पर थोड़ा और लिखा है .. इस मुद्दे को उजागर करने के लिए थानस्क (+1)
पीटर।

2
वास्तव में, जैसा कि [Mat s answer](http://unix.stackexchange.com/a/34258/9537), -v` में बताया गया है और जब वे प्रभावी होते हैं तो तर्क असाइनमेंट भिन्न होते हैं। इसके अलावा -vPOSIX में है और awkकार्यान्वयन के सभी लेकिन सबसे प्राचीन में मौजूद होना चाहिए । ./यह सुनिश्चित करना कि फ़ाइल नाम में गैर-पहचानकर्ता वर्ण का उपयोग करना या बनाना संभव नहीं है, संभवत: उसे अस्वीकार करने का सबसे विश्वसनीय तरीका है।
jw013
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.