Προγραμματισμός με gawk μέρος 2ο: Advanced Input
Description: This is issue 24 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #24
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
Επόμενο Προηγούμενο Περιεχόμενα ### 4. Advanced Input Εξ ορισμού, η awk αυτόματα διαβάζει και εκτελεί συνέχεια την ίδια δουλειά: Διαβάζει μιά εγγραφή και αν ταιριάξει κάποιο πεδίο ή εγγραφή με το πρότυπο, τότε εκτελεί την πράξη. Όμως, η awk σας δίνει την δυνατότητα να "επέμβετε" σε όλην αυτήν την διαδικασία και να πάρετε την είσοδο (input) από ένα άλλο αρχείο ή να προκαλέσετε πρώιμο ξαναξεκίνημα της όλης διαδικασίας, να πάρετε είσοδο από την έξοδο κάποιας εντολής κλπ. ### 4.1 Next Η εντολή next "υποχρεώνει" την awk να διαβάσει την αμέσως επόμενη εγγραφή και να κάνει τα γνωστά (ταίριασμα των προτύπων και αν είναι αληθές, τότε εκτέλεση της πράξης κλπ.), δηλαδή αγνοείται πλήρως η παρούσα εγγραφή που επεξεργάζεται η awk. ### 4.2 Exit Η εντολή exit, χρησιμοποιούμενη σε πράξη, συμπεριφέρεται σαν να έφτασε το τέλος του αρχείου (που επεξεργάζεται η awk). Αυτό έχει σαν συνέπεια να σταματήσει, γενικότερα, η εκτέλεση του κώδικα, δεν εκτελούνται άλλες πράξεις, δεν ταιριάζονται άλλα πρότυπα. Στη συνέχεια, κανονικά, εκτελείται (αν υπάρχει, βέβαια) το ειδικό πρότυπο END. Αν τώρα, χρησιμοποιήσουμε την εντολή exit μέσα στο ειδικό πρότυπο END, τότε τερματίζεται ολόκληρο το πρόγραμμα, δεν εκτελείται τίποτα άλλο στη συνέχεια. ### 4.3 Getline Η εντολή getline διαβάζει μία εγγραφή "κατηγορηματικά", επιστρέφει 1 αν η ανάγνωση της εγγραφής ήταν επιτυχής (θυμίζω πως εξ ορισμού η κάθε γραμμή ενός αρχείου αποτελεί μία εγγραφή), ή 0 αν δεν ήταν επιτυχής (δηλαδή αν έφτασε στο τέλος του αρχείου). Η getline συμπεριφέρεται "κανονικά", δηλαδή ορίζει με τον σωστό τρόπο το $0, ορίζει τις μεταβλητές πεδίων και τις μεταβλητές FNR, NR και NF). ### 4.4 Input από αρχείο Έτσι, λοιπόν, η getline μπορεί να χρησιμεύσει για να πάρετε είσοδο δεδομένων από κάποιο αρχείο, το οποίο δεν αναφέρατε στην γραμμή εντολών. Η γενική μορφή, με την οποία χρησιμοποιούμε την getline σ' αυτήν την περίπτωση είναι η getline < "filename". Σε αυτήν την περίπτωση, αν το αρχείο υπάρχει και η getline διάβασε εγγραφή, επιστρέφει 1, αλλιώς αν έφτασε στο τέλος του αρχείου επιστρέφει 0, ενώ αν το αρχείο δεν υπάρχει επιστρέφει -1. ΣΗΜΕΙΩΣΗ: Και πάλι, οι μεταβλητές $0, οι μεταβλητές πεδίων και η NF ορίζονται κανονικά, ενώ οι μεταβλητές FNR και NR ΔΕΝ ΑΛΛΑΖΟΥΝ, ΠΑΡΑΜΕΝΟΥΝ ΩΣ ΕΙΧΑΝ !! ### 4.5 Input από εντολή Μιά άλλη περίπτωση όπου χρησιμοποιείται η getline, είναι η είσοδος από UNIX εντολή. Ας δούμε πως μπορούμε να συντάξουμε κάτι τέτοιο:
    while ("UNIX εντολή" | getline)
      {
       # ακολουθούν οι εντολές που θέλω να εκτελέσω
       }
Φανταστείτε π.χ. πως θα θέλατε κάθε φορά που μπαίνει ένας χρήστης στο σύστημα, να τυπώνετε ένα μήνυμα (ή, τέλος πάντων, να κάνατε κάτι άλλο), τότε στη θέση της UNIX εντολής θα βάζατε το who ή και το who -u. ### 4.6 Τερματίζοντας το Input από αρχείο ή εντολή Καλό θα είναι, κάθε φορά που χρησιμοποιείτε την getline για να "ανοίξετε" ένα αρχείο ή μία εντολή, δηλαδή να πάρετε είσοδο από αυτά, να τα "κλείνετε" όταν τελειώσετε με αυτά. Υπάρχει ένας μέγιστος αριθμός "ανοιχτών" αρχείων/εντολών που επιτρέπεται σε έναν χρήστη (αυτός ο αριθμός ποικίλει από σύστημα σε σύστημα, αλλά και ανάλογα με τις ρυθμίσεις του διαχειριστή του συστήματος). Με το να "κλείνετε" τις εντολές/αρχεία που χρησιμοποιήσατε, ουσιαστικά μειώνετε την πιθανότητα να φτάσετε τον μέγιστο αριθμό. Λοιπόν, αυτό μπορείτε να το κάνετε με την εξής εντολή:
    close ("filename")
Στη θέση του filename μπορείτε να χρησιμοποιήσετε είτε το όνομα κάποιας μεταβλητής (η οποία περιέχει αρχείο/εντολή) είτε το όνομα της εντολής που χρησιμοποιήσατε (εδώ, προσέξτε να δηλώσετε την ακριβή εντολή που χρησιμοποιήσατε, π.χ. αν χρησιμοποιήσετε την who -u να γράψετε close ("who -u") ...). Επόμενο Προηγούμενο Περιεχόμενα