इस पूरे पाठ में हम भाषा को AWK कहेंगे, और AWK प्रोग्रामों को पढ़कर चलाने वाले एक्ज़ीक्यूटेबल को awk या gawk।
एक AWK प्रोग्राम पैटर्न-एक्शन जोड़ों से बनता है
pattern1 { action1 }
pattern2 { action2 }
...
एक पैटर्न इनपुट से मिलान करने वाला रेगुलर एक्सप्रेशन हो सकता है। यह कोई भी ऐसा एक्सप्रेशन भी हो सकता है जिसका परिणाम सही या गलत वैल्यू हो।
एक एक्शन एक या अधिक AWK कमांड होते हैं। इनके चारों ओर के कर्ली ब्रैकेट ज़रूरी हैं।
अगर पैटर्न का परिणाम सही हो, तो उससे जुड़ा एक्शन चलाया जाता है।
AWK इनपुट को रिकॉर्डों की एक श्रृंखला के रूप में पढ़ता है। हर रिकॉर्ड को शून्य या अधिक फील्डों में बाँटा जाता है।
डिफॉल्ट व्यवहार यह है:
पैटर्न छोड़ा जा सकता है, और तब एक्शन हर इनपुट रिकॉर्ड के लिए चलाया जाता है।
एक्शन छोड़ा जा सकता है, और तब डिफॉल्ट एक्शन यह होता है कि मौजूदा रिकॉर्ड प्रिंट कर दिया जाए।
दो खास पैटर्न हैं जिनका इस्तेमाल अक्सर किया जाता है।
BEGIN से जुड़ा एक्शन कोई भी इनपुट पढ़े जाने से पहले चलाया जाता है।END से जुड़ा एक्शन सारा इनपुट पढ़े जाने के बाद चलाया जाता है।आप फील्डों को $1, $2, $3 इत्यादि से दर्शाते हैं।
मौजूदा रिकॉर्ड $0 होता है।
साफ़ कहें तो ये वाकई "वेरिएबल" नहीं हैं।
$ को एक ऑपरेटर माना जा सकता है, जो दिए गए फील्ड नंबर की वैल्यू निकालता है।
आगे की अवधारणाओं में हम इस पर और गहराई से बात करेंगे।
यहाँ कुछ और अक्सर इस्तेमाल होने वाले बिल्ट-इन वेरिएबल दिए गए हैं।
RS इनपुट रिकॉर्ड सेपरेटर है।
जैसा कि बताया गया, इसकी डिफॉल्ट वैल्यू नई लाइन होती है।FS इनपुट फील्ड सेपरेटर है।इन वेरिएबलो की वैल्यू अक्सर BEGIN एक्शन ब्लॉक में तय की जाती है।
प्रोग्राम चलते समय AWK इन वेरिएबलो की वैल्यू अपने आप तय कर देता है।
NF में मौजूदा रिकॉर्ड के फील्डों की संख्या रहती है।
$NF इस्तेमाल कीजिए।NR में मौजूदा रिकॉर्ड नंबर रहता है।
NR में अब तक पढ़े गए कुल रिकॉर्डों की संख्या रहती है।FNR में मौजूदा इनपुट फाइल के मौजूदा रिकॉर्ड नंबर रहता है।
NR == FNR {action}
इसका मतलब है, "अगर अब तक जुड़ा हुआ रिकॉर्ड नंबर मौजूदा फाइल के रिकॉर्ड नंबर के बराबर हो।"
यह सिर्फ पहली इनपुट फाइल के रिकॉर्डों के लिए ही सही हो सकता है।AWK में सत्यता की अवधारणा वही है जो C में है:
0 गलत होती है।चूँकि AWK एक टेक्स्ट-प्रोसेसिंग भाषा है, सही और गलत के ये मान स्ट्रिंग पर भी लागू होते हैं।
"" गलत होती है।AWK में सत्यता की अवधारणा वही है जो C में है
AWK की शुरुआत 1970 के दशक में Bell Labs में हुई, उसी वातावरण में जहाँ C का आविष्कार हुआ था। C का AWK के सिंटैक्स पर काफी प्रभाव पड़ा।
एक अजीब बात का ध्यान रखिए
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