ट्रैक
/
AWK
AWK
/
सिलेबस
/
बुनियादी बातें
बु

बुनियादी बातें में AWK

1 अभ्यास

बुनियादी बातें के बारे में

इस पूरे पाठ में हम भाषा को AWK कहेंगे, और AWK प्रोग्रामों को पढ़कर चलाने वाले एक्ज़ीक्यूटेबल को awk या gawk।

पैटर्न और एक्शन

एक AWK प्रोग्राम पैटर्न-एक्शन जोड़ों से बनता है

pattern1 { action1 }
pattern2 { action2 }
...

एक पैटर्न इनपुट से मिलान करने वाला रेगुलर एक्सप्रेशन हो सकता है। यह कोई भी ऐसा एक्सप्रेशन भी हो सकता है जिसका परिणाम सही या गलत वैल्यू हो।

एक एक्शन एक या अधिक AWK कमांड होते हैं। इनके चारों ओर के कर्ली ब्रैकेट ज़रूरी हैं।

अगर पैटर्न का परिणाम सही हो, तो उससे जुड़ा एक्शन चलाया जाता है।

रिकॉर्ड और फील्ड

AWK इनपुट को रिकॉर्डों की एक श्रृंखला के रूप में पढ़ता है। हर रिकॉर्ड को शून्य या अधिक फील्डों में बाँटा जाता है।

डिफॉल्ट व्यवहार यह है:

  • नई लाइन को "रिकॉर्ड सेपरेटर" मानकर इनपुट को रिकॉर्डों में बाँटना, यानी हर लाइन एक रिकॉर्ड है।
  • व्हाइटस्पेस को "फील्ड सेपरेटर" मानकर रिकॉर्ड को फील्डों में बाँटना, यानी हर शब्द एक फील्ड है।

पैटर्न और एक्शन, आगे

पैटर्न छोड़ा जा सकता है, और तब एक्शन हर इनपुट रिकॉर्ड के लिए चलाया जाता है।

एक्शन छोड़ा जा सकता है, और तब डिफॉल्ट एक्शन यह होता है कि मौजूदा रिकॉर्ड प्रिंट कर दिया जाए।

खास पैटर्न

दो खास पैटर्न हैं जिनका इस्तेमाल अक्सर किया जाता है।

  • BEGIN से जुड़ा एक्शन कोई भी इनपुट पढ़े जाने से पहले चलाया जाता है।
  • END से जुड़ा एक्शन सारा इनपुट पढ़े जाने के बाद चलाया जाता है।

फील्ड वेरिएबल

आप फील्डों को $1, $2, $3 इत्यादि से दर्शाते हैं।

मौजूदा रिकॉर्ड $0 होता है।

Caution

साफ़ कहें तो ये वाकई "वेरिएबल" नहीं हैं। $ को एक ऑपरेटर माना जा सकता है, जो दिए गए फील्ड नंबर की वैल्यू निकालता है। आगे की अवधारणाओं में हम इस पर और गहराई से बात करेंगे।

यहाँ कुछ और अक्सर इस्तेमाल होने वाले बिल्ट-इन वेरिएबल दिए गए हैं।

इनपुट पार्सिंग को नियंत्रित करने वाले बिल्ट-इन वेरिएबल

  • RS इनपुट रिकॉर्ड सेपरेटर है। जैसा कि बताया गया, इसकी डिफॉल्ट वैल्यू नई लाइन होती है।
  • FS इनपुट फील्ड सेपरेटर है।

इन वेरिएबलो की वैल्यू अक्सर BEGIN एक्शन ब्लॉक में तय की जाती है।

जानकारी देने वाले बिल्ट-इन वेरिएबल

प्रोग्राम चलते समय AWK इन वेरिएबलो की वैल्यू अपने आप तय कर देता है।

  • NF में मौजूदा रिकॉर्ड के फील्डों की संख्या रहती है।
    • अंतिम फील्ड की वैल्यू पाने के लिए $NF इस्तेमाल कीजिए।
  • NR में मौजूदा रिकॉर्ड नंबर रहता है।
    • जब कई इनपुट फाइलें पढ़ी जा रही हों, तो NR में अब तक पढ़े गए कुल रिकॉर्डों की संख्या रहती है।
  • FNR में मौजूदा इनपुट फाइल के मौजूदा रिकॉर्ड नंबर रहता है।
    • NR और FNR के अंतर को समझाने के लिए, यहाँ AWK का एक आम तरीका दिया गया है।
      NR == FNR {action}
      
      इसका मतलब है, "अगर अब तक जुड़ा हुआ रिकॉर्ड नंबर मौजूदा फाइल के रिकॉर्ड नंबर के बराबर हो।" यह सिर्फ पहली इनपुट फाइल के रिकॉर्डों के लिए ही सही हो सकता है।

सत्यता

AWK में सत्यता की अवधारणा वही है जो C में है:

  • संख्या 0 गलत होती है।
  • इसके अलावा कोई भी संख्या सही होती है।

चूँकि AWK एक टेक्स्ट-प्रोसेसिंग भाषा है, सही और गलत के ये मान स्ट्रिंग पर भी लागू होते हैं।

  • खाली स्ट्रिंग "" गलत होती है।
  • कोई भी गैर-खाली स्ट्रिंग सही होती है।
Note

AWK में सत्यता की अवधारणा वही है जो C में है

AWK की शुरुआत 1970 के दशक में Bell Labs में हुई, उसी वातावरण में जहाँ C का आविष्कार हुआ था। C का AWK के सिंटैक्स पर काफी प्रभाव पड़ा।

Caution

एक अजीब बात का ध्यान रखिए

  • संख्या 0 गलत होती है।
  • गैर-खाली स्ट्रिंग "0" सही होती है!

AWK के डेटा टाइप के बारे में हम आगे की अवधारणाओं में और बात करेंगे।

कमेंट

कमेंट # अक्षर से शुरू होते हैं और लाइन के अंत तक चलते हैं।

awk को इनपुट कैसे दें

awk फाइलों से या स्टैंडर्ड इनपुट से इनपुट पढ़ सकता है। इनमें से कोई भी तरीका काम करेगा।

awk '/regex/ {print $1}' file1 file2 ...

awk '/regex/ {print $1}' < file

some_command_here | awk '/regex/ {print $1}'

उदाहरण

Unix जैसे सिस्टम पर /etc/passwd में उपयोगकर्ताओं की जानकारी होती है। हर उपयोगकर्ता अलग लाइन पर लिखा होता है, और उसके फील्ड कोलन से अलग किए जाते हैं।

उपयोगकर्ता नामों की सूची बनाने के लिए:

awk '
    BEGIN { FS = ":" }
    { print $1 }
' /etc/passwd

ध्यान दीजिए कि {print $1} एक्शन के साथ कोई पैटर्न नहीं है, इसलिए यह हर रिकॉर्ड के लिए चलाया जाता है।

अगर हम आउटपुट सिर्फ उन उपयोगकर्ताओं तक सीमित करना चाहें जो अपने लॉगिन शेल के रूप में bash इस्तेमाल करते हैं, तो हम ऐसा कर सकते हैं:

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

कुछ और उदाहरण

यहाँ कुछ ऐसे awk प्रोग्राम दिए गए हैं जो दूसरे आम Unix कमांड जैसा ही परिणाम देते हैं।

  • किसी फाइल को दिखाना

    cat file.txt
    
    awk '1' file.txt
    
  • फाइल में पैटर्न खोजना

    grep 'foo.*bar' file.txt
    
    awk '/foo.*bar/' file.txt
    
  • फाइल के शुरू की कुछ ही लाइनें दिखाना

    head -n 20 file.txt
    
    awk '
        1
        NR == 20 {exit}
    ' file.txt
    
  • फाइल में टेक्स्ट बदलना

    sed 's/foo/bar/' file.txt
    
    awk '{sub(/foo/, "bar")};1' file.txt
    # or more readably
    awk '
        {
            sub(/foo/, "bar")
            print
        }
    ' file.txt
    
GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

बुनियादी बातें सीखिए