awk ट्यूटोरियल
शुरुआत जागरण से हो रही है
खोज…
टिप्पणियों
संस्करण
| नाम | प्रारंभिक संस्करण | संस्करण | रिलीज़ की तारीख |
|---|---|---|---|
| POSIX awk | 1992 | IEEE एसटीडी 1003.1, 2013 संस्करण | 2013-04-19 |
| एक ट्रू अवाक या नॉक या बीडब्ल्यूके जाग | 198X | - | 2012-12-20 |
| जीएनयू जाग या गौक | 1986 | 4.1.3 | 2015/05/19 |
नमस्ते दुनिया
हैलो वर्ल्ड उदाहरण के रूप में सरल है:
awk 'BEGIN {print "Hello world"}'
सबसे बुनियादी awk प्रोग्राम में एक वास्तविक मूल्य (आमतौर पर 1 ) होता है और awk इसके इनपुट को प्रतिध्वनित करता है:
$ date | awk '1'
Mon Jul 25 11:12:05 CEST 2016
चूंकि "हैलो वर्ल्ड" भी एक सही मूल्य है, आप यह भी कह सकते हैं:
$ date | awk '"hello world"'
Mon Jul 25 11:12:05 CEST 2016
हालाँकि, यदि आप लिखते हैं तो आपका इरादा बहुत स्पष्ट हो जाता है
$ date | awk '{print}'
Mon Jul 25 11:12:05 CEST 2016
बजाय।
AWK प्रोग्राम कैसे चलाएं
यदि कार्यक्रम छोटा है, तो आप इसे कमांड में शामिल कर सकते हैं जो कि awk चलाता है:
awk -F: '{print $1, $2}' /etc/passwd
इस उदाहरण में, कमांड लाइन स्विच -F: का उपयोग करते हुए -F: हम उपयोग करने के लिए awk को सलाह देते हैं: इनपुट फ़ील्ड्स सीमांकक के रूप में। जैसा है वैसा ही है
awk 'BEGIN{FS=":"}{print $1,$2}' file
वैकल्पिक रूप से, हम एक awk फ़ाइल में पूरे awk कोड को बचा सकते हैं और इस awk प्रोग्राम को इस तरह से कॉल कर सकते हैं:
awk -f 'program.awk' input-file1 input-file2 ...
program.awk जो भी बहु कार्यक्रम हो सकता है, अर्थात:
# file print_fields.awk
BEGIN {print "this is a header"; FS=":"}
{print $1, $2}
END {print "that was it"}
और फिर इसके साथ चलाएं:
awk -f print_fields.awk /etc/passwd #-f advises awk which program file to load
या आम तौर पर:
awk -f program-file input-file1 input-file2 ...
एक अलग फ़ाइल में कार्यक्रम होने का लाभ यह है कि आप समझ बनाने के लिए सही पहचान के साथ प्रोग्राम लिख सकते हैं, आप #, आदि के साथ टिप्पणी शामिल कर सकते हैं।
उदाहरण के लिए AWK
AWK स्ट्रिंग हेरफेर भाषा है, जिसका उपयोग बड़े पैमाने पर UNIX सिस्टम में किया जाता है। AWK के पीछे का विचार फाइलों पर काम करते समय उपयोग करने के लिए एक बहुमुखी भाषा बनाना था, जिसे समझना बहुत जटिल नहीं था।
एडब्ल्यूके के कुछ अन्य संस्करण हैं, लेकिन मुख्य अवधारणा समान है, बस अतिरिक्त सुविधाओं के साथ। ये अन्य वेरिएंट NAWK और GAWK हैं। GAWK में दोनों की सभी विशेषताएं शामिल हैं, जबकि NAWK AWK से एक कदम ऊपर है, यदि आप चाहें।
AWK के बारे में सोचने का सबसे सरल तरीका है, यह विचार करना कि इसके 2 मुख्य भाग हैं। पैटर्न, और कार्रवाई।
शायद AWK का सबसे बुनियादी उदाहरण: (यह भी देखें: हैलो वर्ल्ड)
BEGIN {print "START"}
{print }
END {print "STOP" }
यहां, कीवर्ड BEGIN और END पैटर्न हैं, जबकि कार्रवाई {} के अंदर है। यह उदाहरण बेकार होगा, लेकिन यह केवल मामूली बदलावों को वास्तव में एक उपयोगी कार्य में ले जाएगा।
BEGIN {print "File\tAuthor"}
{print $8, "\t", $3}
END {print " - DONE - "}
यहाँ, \t एक टैब वर्ण का प्रतिनिधित्व करता है, और इसका उपयोग आउटपुट लाइन की सीमाओं तक भी किया जाता है। $ 8 और $ 3 Shell Scripts में देखे जाने वाले उपयोग के समान हैं, लेकिन 3 जी और 8 वें तर्कों का उपयोग करने के बजाय, यह इनपुट लाइन के 3 और 8 वें कॉलम का उपयोग करता है।
तो, यह उदाहरण मुद्रित होगा: शीर्ष पंक्ति पर फ़ाइल लेखक, जबकि दूसरी पंक्ति फ़ाइल पथों के साथ करना है। $ 8 फ़ाइल का नाम है, $ 3 मालिक है (जब निर्देशिका पथ को देखते हैं, तो यह अधिक स्पष्ट होगा)। अंत में, नीचे की रेखा प्रिंट होगी, जैसा कि आप उम्मीद करेंगे - संपन्न -
उपरोक्त उदाहरण का श्रेय http://www.grymoire.com/Unix/Awk.html को जाता है
संदर्भ फ़ाइल
ग्रेग गोएबेल से coins.txt :
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
silver 10 1981 USA ingot
gold 1 1984 Switzerland ingot
gold 1 1979 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 0.1 1986 PRC Panda
silver 1 1986 USA Liberty dollar
gold 0.25 1986 USA Liberty 5-dollar piece
silver 0.5 1986 USA Liberty 50-cent piece
silver 1 1987 USA Constitution dollar
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1988 Canada Maple Leaf
न्यूनतम सिद्धांत
जनरल अवेक वन-लाइनर:
awk <awk program> <file>
या:
<shell-command> | awk <awk program>
<shell-command> और <file> को awk input के रूप में संबोधित किया जाता है।
<awk program> इस टेम्प्लेट का अनुसरण करने वाला एक कोड है (एकल, दोहरा नहीं, उद्धरण):
'BEGIN {<init actions>};
<cond1> {<program actions>};
<cond2> {<program actions>};
...
END {<final actions>}'
कहाँ पे:
-
<condX>स्थिति सबसे अधिक बार एक नियमित अभिव्यक्ति/re/, जिसे awk इनपुट लाइनों के साथ मिलान किया जाना है; - शेल्फ़ कमांड के समान, सी-लाइक के निर्माणों से सुसज्जित,
<* actions>स्टेटमेंट्स हैं ।
`` निम्नलिखित नियमों के अनुसार संसाधित किया जाता है:
-
BEGIN ...औरEND ...वैकल्पिक और इनपुट लाइनों के प्रसंस्करण से पहले या बाद में निष्पादित होते हैं। -
<condN>इनपुट में प्रत्येक पंक्ति के लिए, यदि कंडिशन<condN>मांस है, तो संबंधित<program actions>ब्लॉक निष्पादित किया जाता है। -
{<program actions>}डिफॉल्ट्स टू{print $0}।
शर्तों को मानक तार्किक ऑपरेटरों के साथ जोड़ा जा सकता है:
/gold/ || /USA/ && !/1986/
जहाँ && पर पूर्वता है || ;
print स्टेटमेंट । print item1 item2 STDOUT पर बयान प्रिंट आइटम नहीं है।
आइटम चर ( X , $0 ), तार ("हैलो") या संख्या हो सकते हैं।
item1, item2 को OFS चर के मूल्य के साथ जोड़ा जाता है;
item1 item2 justapoxed कर रहे हैं! अधिक सुविधाओं के लिए रिक्त स्थान या item1 " " item2 लिए item1 " " item2 उपयोग करें।
चर की जरूरत नहीं है $ , यानी: print myVar;
निम्नलिखित विशेष चर awk में बनाए गए हैं:
-
FS: फ़ील्ड में विभाजक इनपुट लाइनों को विभाजित करने के लिए फ़ील्ड विभाजक के रूप में कार्य करता है। मैं एक एकल चरित्र हो सकता हूं,FS="c"; एक अशक्त स्ट्रिंग,FS=""(फिर प्रत्येक व्यक्तिगत चरित्र एक अलग क्षेत्र बन जाता है); स्लैश के बिना एक नियमित अभिव्यक्ति,FS="re";FS=" "स्थान और टैब के रन के लिए खड़ा है और यह डिफॉल्ट मान है। -
NF: पढ़ने के लिए फ़ील्ड की संख्या; -
$1,$2, ...: पहला क्षेत्र, दूसरा क्षेत्र। वर्तमान इनपुट लाइन के आदि, -
$0: वर्तमान इनपुट लाइन; -
NR: करंट लाइन लाइन नंबर। -
OFS: मुद्रित होने पर खेतों को समतल करने के लिए स्ट्रिंग। -
ORS: आउटपुट रिकॉर्ड विभाजक, डिफ़ॉल्ट रूप से एक नई रेखा। -
RS: इनपुट लाइन (रिकॉर्ड) विभाजक। न्यूलाइन को डिफॉल्ट करता है।FSरूप में सेट करें। -
IGNORECASE: नियमित अभिव्यक्ति होने पर FS और RS को प्रभावित करता है;
उदाहरण
रेगेक्स gold द्वारा लाइनों को फ़िल्टर करें और उन्हें गिनें:
# awk 'BEGIN {print "Coins"} /gold/{i++; print $0} END {print i " lines out of " NR}' coins.txt
Coins
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
gold 1 1984 Switzerland ingot
gold 1 1979 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 0.1 1986 PRC Panda
gold 0.25 1986 USA Liberty 5-dollar piece
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1988 Canada Maple Leaf
9 lines out of 13
डिफॉल्ट print $0 एक्शन और कंडीशन आंतरिक अवेक चर NR पर आधारित है:
# awk 'BEGIN {print "First 3 coins"} NR<4' coins.txt
First 3 coins
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
silver 10 1981 USA ingot
सी-शैली `प्रिंटफ़` के साथ प्रारूपण: # awk '{printf ("%s \t %3.2f\n", $1, $2)}' coins.txt
gold 1.00
gold 1.00
silver 10.00
gold 1.00
gold 1.00
gold 0.50
gold 0.10
silver 1.00
gold 0.25
silver 0.50
silver 1.00
gold 0.25
gold 1.00
दशा उदाहरण
awk 'NR % 6' # prints all lines except those divisible by 6
awk 'NR > 5' # prints from line 6 onwards (like tail -n +6, or sed '1,5d')
awk '$2 == "foo"' # prints lines where the second field is "foo"
awk '$2 ~ /re/' # prints lines where the 2nd field mateches the regex /re/
awk 'NF >= 6' # prints lines with 6 or more fields
awk '/foo/ && !/bar/' # prints lines that match /foo/ but not /bar/
awk '/foo/ || /bar/' # prints lines that match /foo/ or /bar/ (like grep -e 'foo' -e 'bar')
awk '/foo/,/bar/' # prints from line matching /foo/ to line matching /bar/, inclusive
awk 'NF' # prints only nonempty lines (or: removes empty lines, where NF==0)
awk 'NF--' # removes last field and prints the line
एक क्रिया जोड़कर {...} एक विशिष्ट फ़ील्ड को प्रिंट कर सकता है, बजाय पूरी लाइन के, जैसे:
awk '$2 ~ /re/{print $3 " " $4}'
लाइनों के तीसरे और चौथे क्षेत्र को प्रिंट करता है जहां दूसरा क्षेत्र regex / re / को mateches करता है।
कुछ स्ट्रिंग फ़ंक्शन
substr() फ़ंक्शन:
# awk '{print substr($3,3) " " substr($4,1,3)}'
86 USA
08 Aus
81 USA
84 Swi
79 RSA
81 RSA
86 PRC
86 USA
86 USA
86 USA
87 USA
87 USA
88 Can
match(s, r [, arr]) s में वह स्थिति देता है जहां रेगेक्स r होता है और RSTART और RLENGTH के मान सेट करता है। यदि तर्क arr है, तो यह एरे arr लौटाता है जहाँ तत्व मिलान किए गए कोष्ठक उपपरिवर्तन पर सेट होते हैं। की 0'th तत्व मैचों arr पूरे regex मैच को तैयार है। इसके अलावा अभिव्यक्तियाँ arr[n, "start"] और arr[n, "length"] प्रत्येक मिलान के विकल्प की प्रारंभिक स्थिति और लंबाई प्रदान करती हैं।
अधिक स्ट्रिंग कार्य:
sub(/regexp/, "newstring"[, target])
gsub(/regexp/, "newstring"[, target])
toupper("string")
tolower("string")
बयान
एक साधारण कथन अक्सर निम्न में से कोई एक होता है:
variable = expression
print [ expression-list ]
printf format [ , expression-list ]
next # skip remaining patterns on this input line
exit # skip the rest of the input
यदि stat1 और stat2 स्टेटमेंट हैं, तो निम्नलिखित स्टेटमेंट भी हैं:
{stat}
{stat1; stat2}
{stat1
stat2}
if ( conditional ) statement [ else statement ]
निम्नलिखित मानक C- जैसे निर्माण हैं, कथन हैं:
if ( conditional ) statement [ else statement ]
while ( conditional ) statement
for ( expression ; conditional ; expression ) statement
break # usual C meaning
continue # usual C meaning
चर लंबाई वर्णन तत्व को मुद्रित करने के लिए सी-स्टाइल लूप, फ़ील्ड 4 से शुरू होता है:
# awk '{out=""; for(i=4;i<=NF;i++){out=out" "$i}; print out}' coins.txt
USA American Eagle
Austria-Hungary Franz Josef 100 Korona
USA ingot
Switzerland ingot
RSA Krugerrand
RSA Krugerrand
PRC Panda
USA Liberty dollar
USA Liberty 5-dollar piece
USA Liberty 50-cent piece
USA Constitution dollar
USA Constitution 5-dollar piece
Canada Maple Leaf
ध्यान दें कि i 0 से आरंभीकृत i ।
यदि स्थितियाँ और गणनाएँ नूनरिक क्षेत्रों पर लागू होती हैं:
# awk '/gold/ {if($3<1980) print $0 "$" 425*$2}' coins.txt
gold 1 1908 Austria-Hungary Franz Josef 100 Korona $425
gold 1 1979 RSA Krugerrand $425
AWK निष्पादन योग्य स्क्रिप्ट
#!/usr/bin/gawk -f
# This is a comment
(pattern) {action}
...
शेल चरों को पार करना
# var="hello"
# awk -v x="$var" 'BEGIN {print x}'
hello