Το Awk είναι μια ισχυρή γλώσσα προγραμματισμού επεξεργασίας δεδομένων ενσωματωμένη σε σχεδόν κάθε σύστημα * nix. Μοιάζει με μια γλώσσα προγραμματισμού γενικού σκοπού στην επιφάνεια, αλλά έχει κατασκευαστεί για να λαμβάνει εισόδους και να εκτελεί ενέργειες που βασίζονται σε αυτή την είσοδο. Αν χρειαστεί να επεξεργαστείτε κείμενο με βάση συγκεκριμένες συνθήκες, το awk σχεδόν πάντα θα κάνει τη δουλειά πιο γρήγορα από μια γενική γλώσσα όπως το Γ. Επίσης, ερμηνεύεται, ώστε να αποφύγετε τη μακροχρόνια διαδικασία σύνταξης και εντοπισμού σφαλμάτων των μεταγλωττισμένων γλωσσών.

Εξαιρετικό γεγονός : το περίεργο όνομα του προγράμματος είναι ένας αρχικός προγραμματισμός των ονομάτων προγραμματιστών: ο Alfred A ho, ο Peter W einberger και ο Brian Kernighan

Βασική σύνταξη του Awk

Όταν ενεργοποιείται στη γραμμή εντολών, το awk ακολουθεί το παρακάτω βασικό μοτίβο:

 πρότυπο {action} μοτίβο αρχείου {action} αρχείο ... 

Awk θα εκτελέσει τη δράση όποτε το μοτίβο ταιριάζει εντός του καθορισμένου αρχείου. Αν δεν καθορίσετε ένα αρχείο, το awk θα τρέξει με την τυπική έξοδο. Κατά την αντιστοίχιση προτύπων, το awk μπορεί να πάρει κανονικές εκφράσεις καθώς και προγραμματική εισαγωγή. Ας εξετάσουμε αυτό το βασικό παράδειγμα παρακάτω:

 awk '/ com / {print $ 0}' emails 

Αυτό το πρόγραμμα μιας γραμμής θα εκτυπώσει κάθε γραμμή από το αρχείο "μηνύματα ηλεκτρονικού ταχυδρομείου" που περιέχουν τους χαρακτήρες com . Στο awk $0 αναφέρεται στην τρέχουσα γραμμή, η οποία είναι επίσης η προεπιλεγμένη συμπεριφορά. Η γραμμή θα μπορούσε να έχει γραφτεί χωρίς $0, και θα είχε λειτουργήσει πανομοιότυπα.

Εκτύπωση πεδίων

Επειδή το awk μπορεί να εντοπίσει και να διαχωρίσει τους διαχωριστές πεδίων, είναι χρήσιμο για την εκτύπωση συγκεκριμένων στηλών ή σειρών δεδομένων. Θα χρησιμοποιήσουμε το αρχείο "/ etc / passwd" για αυτό το παράδειγμα.

 awk -F ":" '{print $ 1}' / etc / passwd 

Αυτό το πρόγραμμα μιας γραμμής κάνει λίγα πράγματα. Η σημαία -F υποδηλώνει ότι ο επόμενος χαρακτήρας ( : σε αυτό το παράδειγμα) πρέπει να ερμηνευτεί ως ο διαχωριστής πεδίων. Παρέχοντας τους εκτυπώνει το πρώτο πεδίο, καθορίζεται από $1 .

Μπορούμε επίσης να εκτυπώσουμε περισσότερα από ένα πεδία ταυτοχρόνως, προσδιορίζοντας διαδοχικά τα πεδία:

 awk -F ":" '{print $ 4 "" $ 5}' / etc / passw 

Θα παράγει αποτελέσματα που μοιάζουν με τα παρακάτω.

Αυτό εκτυπώνει το τέταρτο και το πέμπτο πεδίο του αρχείου passwd με ένα κενό μεταξύ τους. Σημειώστε ότι ο χώρος βρίσκεται ανάμεσα σε διπλά εισαγωγικά. Αυτό ορίζει ως κυριολεκτικό χαρακτήρα μέσα στην εντολή εκτύπωσης, έτσι ώστε να εκτυπώνεται όπως γράφτηκε. Μπορούμε επίσης να προσθέσουμε πιο περίπλοκα κείμενα για να καθαρίσουμε την παραγωγή μας:

 awk -F ":" 'διαδικασία {print ":" $ 5 "\ t \ t" "κατάλογος:" $ 6}' / etc / passwd 

Αυτό θα εκτυπώσει την έξοδο με ετικέτες για αναγνώριση. Και μπορούμε να εξάγουμε όλα αυτά σε ένα νέο αρχείο χρησιμοποιώντας μια καρφίτσα (>).

 awk -F ":" 'διαδικασία {print ":" $ 5 "\ t \ t" "directory:" $ 6}' / etc / passwd> processes.txt 

Μπορούμε να συνδυάσουμε όσα γνωρίζουμε μέχρι στιγμής για την εκτενή επεξεργασία δεδομένων. Για παράδειγμα, μπορούμε να χρησιμοποιήσουμε κανονικές εκφράσεις για να εκτυπώσουμε όλες τις γραμμές από ένα έγγραφο που περιέχει έναν έγκυρο αριθμό τηλεφώνου των ΗΠΑ.

 awk '/ ^(\+\d{1, 2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4 } $ / {print} 'επαφές 

Διεύρυνση της ταιριαστικής ισχύος της εντολής Awk

Το Awk μπορεί επίσης να επεξεργαστεί πληροφορίες χρησιμοποιώντας μια ποικιλία τελεστών. Αυτό περιλαμβάνει τυποποιημένους τελεστές όπως ==, <, >, <=, >=, και !=, Καθώς και awk-συγκεκριμένους τελεστές ~ και !~, Που σημαίνει "αντιστοιχεί" και "δεν ταιριάζει" αντίστοιχα. Αυτοί οι τελεστές χρησιμοποιούνται όταν συγκρίνουμε κανονικές εκφράσεις με λογική Boolean, καθώς και πιο τυποποιημένες προγραμματικές φράσεις.

Παραδείγματα εντολών Awk

 awk 'μήκος ($ 0)> 80' δεδομένα 

Εκτυπώνει όλες τις γραμμές με μήκος μεγαλύτερο από ογδόντα χαρακτήρες στο αρχείο "data." Σημειώστε την έλλειψη μιας δήλωσης εκτύπωσης: ελλείψει συγκεκριμένης ενέργειας, το awk θα εκτυπώσει την πλήρη γραμμή κάθε φορά που ένα πρότυπο ταιριάζει.

 $ 1 == "χρήστης" {print} 

Εκτυπώνει όλες τις γραμμές όπου το πρώτο πεδίο ισούται με τη συμβολοσειρά "χρήστη". Χωρίς σημαία -F, το awk θα χρησιμοποιήσει τον κενό χώρο ως τον προεπιλεγμένο διαχωριστή πεδίων. Επίσης, σημειώστε ότι το awk και το αρχείο δεν καθορίζονται. Αυτό είναι για χρήση σε σενάρια σε ξεχωριστά αρχεία, όπως καλύπτεται παρακάτω.

 $ 5 ~ / root / {print $ 3} 

Εκτυπώνει το τρίτο πεδίο όποτε το πέμπτο πεδίο ταιριάζει με την κανονική έκφραση /root/ .

 {if ($ 5! ~ / root /) {print $ 3}} 

Όταν το πεδίο 5 δεν ταιριάζει /root/, εκτυπώστε το πεδίο 3. Αυτό χρησιμοποιεί τη δήλωση C-like, η οποία είναι επίσης συμβατή με awk. Αυτή η μορφή επιτρέπει περισσότερη ευελιξία στους προγραμματιστές που είναι εξοικειωμένοι με τις γλώσσες γενικού σκοπού.

Αποθήκευση σεναρίων σε αρχεία

Τα scripts Awk μπορούν επίσης να αποθηκευτούν σε αρχεία που σας επιτρέπουν να αποθηκεύσετε πιο σύνθετα προγράμματα:

 awk -f ~ / scripts / program.awk δεδομένα 

Όταν χρησιμοποιείτε τη σημαία -f, το awk εκτελεί το σενάριο στην καθορισμένη διαδρομή αρχείου, δηλαδή το program.awk . Οι εντολές σε αυτό το πρόγραμμα θα επεξεργαστούν το αρχείο "δεδομένα".

Οι ενέργειες μπορούν επίσης να εκτελεστούν πριν και μετά το πρόγραμμα, χρησιμοποιώντας BEGIN και END :

 BEGIN {FS = ":"} # δηλώνει ότι: είναι ο διαχωριστής πεδίων για το πρόγραμμα. #operations END {print "Έχετε τελειώσει"} # εκτυπώνει ένα χαρούμενο μήνυμα για το χρήστη 

Όπως μπορείτε να δείτε παραπάνω, το σύμβολο # ξεκινά ένα σχόλιο, το οποίο διαρκεί μέχρι το τέλος της γραμμής.

συμπέρασμα

Αυτός ο οδηγός αγγίζει μόνο τα πιο βασικά στοιχεία του awk. Υπάρχουν πολλά περισσότερα για να οικοδομήσουμε και να εξερευνήσουμε πέρα ​​από αυτό. Εξετάστε την τεκμηρίωση του GNU για awk ή τη γλώσσα προγραμματισμού Awk και το βιβλίο awk που γράφτηκε από τους προγραμματιστές του προγράμματος.