Διαδρομές
/
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 δημιουργήθηκε στα Bell Labs τη δεκαετία του 1970, στο ίδιο περιβάλλον όπου εφευρέθηκε η 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 Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Βασικές αρχές