awkशुरुआत जागरण से हो रही है


टिप्पणियों

AWK नाम इसके रचनाकारों अल्फ्रेड वी। अहो, पीटर जे। वेनबर्गर और
ब्रायन डब्ल्यू कर्निघन।

साधन

संस्करण

नाम प्रारंभिक संस्करण संस्करण रिलीज़ की तारीख
POSIX awk 1992 IEEE एसटीडी 1003.1, 2013 संस्करण 2013-04-19
एक ट्रू अवाक या नॉक या बीडब्ल्यूके जाग 198X - 2012-12-20
जीएनयू जाग या गौक 1986 4.1.3 2015/05/19

उदाहरण के लिए 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> स्टेटमेंट्स हैं

`` निम्नलिखित नियमों के अनुसार संसाधित किया जाता है:
  1. BEGIN ... और END ... वैकल्पिक और इनपुट लाइनों के प्रसंस्करण से पहले या बाद में निष्पादित होते हैं।
  2. <condN> इनपुट में प्रत्येक पंक्ति के लिए, यदि कंडिशन <condN> मांस है, तो संबंधित <program actions> ब्लॉक निष्पादित किया जाता है।
  3. {<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
 

नमस्ते दुनिया

हैलो वर्ल्ड उदाहरण के रूप में सरल है:

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 ...
 

एक अलग फ़ाइल में कार्यक्रम होने का लाभ यह है कि आप समझ बनाने के लिए सही पहचान के साथ प्रोग्राम लिख सकते हैं, आप #, आदि के साथ टिप्पणी शामिल कर सकते हैं।