Διαφήμιση

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

Λοιπόν, τι είναι; Πώς χρησιμοποιούνται; Και πώς, όταν συνδυάζονται μαζί, διευκολύνουν την επεξεργασία κειμένου;

Τι είναι το Sed;

Σεντ αναπτύχθηκε το 1971 στις Εργαστήρια Bell, από το θρυλικό πρωτοπόρο της πληροφορικής Λι Ε. ΜακΜάχον.

Το όνομα σημαίνει πρόγραμμα επεξεργασίας ροής, και αυτό κάνει. Σας επιτρέπει να επεξεργαστείτε σώματα ή ροές κειμένου μέσω προγραμματισμού, μέσω μιας συμπαγούς και απλής γλώσσας προγραμματισμού, αλλά ταυτόχρονα Turing.

Ο τρόπος που λειτουργεί είναι απλός: διαβάζει κείμενο, κάθε γραμμή σε ένα buffer. Για κάθε γραμμή, θα εκτελεί τις προκαθορισμένες οδηγίες, κατά περίπτωση.

Για παράδειγμα, εάν κάποιος έγραφε ένα σενάριο Sed που αντικατέστησε τη λέξη «μπύρα» με «σόδα» και στη συνέχεια πέρασε σε ένα αρχείο κειμένου που περιείχε ολόκληρο στίχοι στο "99 μπουκάλια μπύρας στον τοίχο", θα περνούσε αυτό το αρχείο σε γραμμή προς γραμμή, και θα εκτυπώσει "99 μπουκάλια σόδας στον τοίχο", και έτσι επί.

instagram viewer

Το πιο βασικό σενάριο Sed είναι ένα Hello World. Εδώ, χρησιμοποιούμε το βοηθητικό πρόγραμμα Unix Echo, το οποίο απλώς χορδές εξόδου, για να εκτυπώσουμε το "Hello World". Αλλά το κάνουμε αυτό στο Σεντ και το λέμε να αντικαταστήσει το «Κόσμο» με το «Ντέιβ». Αυτονόητα πράγματα.

echo "Γεια σας Κόσμος" | sed s / world / Dave
sedawk-dave

Μπορείτε επίσης να συνδυάσετε τις οδηγίες Sed σε αρχεία, εάν χρειάζεται να κάνετε κάποια πιο περίπλοκη επεξεργασία. Εμπνευσμένη από αυτό το ξεκαρδιστικό νήμα Reddit, Θα μεταφέρω τους στίχους στο A-Ha's Πάρε μεκαι αντικαταστήστε κάθε παρουσία των "I", "Me" και "My", με τον Greg.

Πρώτον, θα βάλω τους στίχους στο τραγούδι σε ένα αρχείο κειμένου που ονομάζεται tom.txt. Τότε θα ανοίξω τον προτιμώμενο επεξεργαστή κειμένου (το δικό μου το αγαπημένο είναι το Vim Οι κορυφαίοι 7 λόγοι για να δώσετε μια ευκαιρία στο πρόγραμμα επεξεργασίας κειμένου VimΕδώ και χρόνια, δοκίμασα τον έναν επεξεργαστή κειμένου μετά τον άλλο. Το ονομάζεις, το δοκίμασα. Χρησιμοποίησα κάθε έναν από αυτούς τους συντάκτες για πάνω από δύο μήνες ως πρωταρχικός μου καθημερινός συντάκτης. Κατά κάποιο τρόπο, εγώ ... Διαβάστε περισσότερα , αλλά Νάνο νανο εναντίον vim: Συγκριτικοί επεξεργαστές κειμένου τερματικούΠαρόλο που το Linux έχει γίνει αρκετά εύκολο για σχεδόν οποιονδήποτε να το χρησιμοποιήσει χωρίς να χρειάζεται να χρησιμοποιήσει ποτέ το Terminal, υπάρχουν μερικοί από εμάς που το χρησιμοποιούμε τακτικά ή είμαστε περίεργοι για το πώς μπορεί κανείς να ελέγξει ... Διαβάστε περισσότερα και Gedit gedit: Ένας από τους επεξεργαστές απλού κειμένου με τις περισσότερες δυνατότητες [Linux & Windows]Όταν σκέφτεστε τους επεξεργαστές απλού κειμένου, το πρώτο πράγμα που μπορεί να εμφανιστεί στο μυαλό σας είναι η εφαρμογή Notepad των Windows. Κάνει ακριβώς αυτό που περιγράφει η περιγραφή της εργασίας του - απλά χαρακτηριστικά για ένα απλό κείμενο ... Διαβάστε περισσότερα είναι και οι δύο εξαιρετικές επιλογές) και προσθέστε τις ακόλουθες γραμμές. Βεβαιωθείτε ότι το αρχείο με το οποίο δημιουργείτε τελειώνει .sed.

sed-greg-sed

Ίσως παρατηρήσετε ότι στο παραπάνω παράδειγμα, έχω επαναλάβει τον εαυτό μου (π.χ. s / me / Greg / και s / Me / Greg /). Αυτό συμβαίνει επειδή ορισμένες εκδόσεις του Sed, όπως αυτή που διατίθεται με Mac OS X, έχουν δεν υποστήριξη αντιστοίχισης χωρίς κεφαλαία. Ως αποτέλεσμα, πρέπει να γράψουμε δύο Sed οδηγίες για κάθε λέξη, ώστε να αναγνωρίζει την κεφαλαιοποιημένη και χωρίς κεφαλαιοποίηση εκδοχή.

Αυτό δεν θα λειτουργήσει τέλεια, σαν να έχετε αντικαταστήσει κάθε παρουσία των "I", "Me" και "My" με το χέρι. Θυμηθείτε, το χρησιμοποιούμε απλώς ως άσκηση για να δείξουμε πώς μπορείτε να ομαδοποιήσετε τις οδηγίες Sed σε ένα σενάριο και, στη συνέχεια, να τις εκτελέσετε με μία μόνο εντολή.

Στη συνέχεια, πρέπει να καλέσουμε το αρχείο. Για να γίνει αυτό, εκτελούμε αυτήν την εντολή.

γάτα tom.txt | sed -f greg.sed

Ας επιβραδύνουμε και να δούμε τι κάνει. Οι αναγνώστες με ανοιχτά μάτια θα έχουν παρατηρήσει ότι είμαστε δεν χρησιμοποιώντας το Echo εδώ. Χρησιμοποιούμε τη γάτα. Αυτό συμβαίνει επειδή ενώ η Cat θα εκτυπώσει ολόκληρο το περιεχόμενο του αρχείου, η ηχώ θα εκτυπώσει μόνο το όνομα του αρχείου. Θα έχετε επίσης παρατηρήσει ότι τρέχουμε Sed με τη σημαία "-f". Αυτό το λέει να ανοίξει το σενάριο ως αρχείο.

Το τελικό αποτέλεσμα είναι αυτό.

sed-greg-σενάριο

Αξίζει επίσης να σημειωθεί ότι το Sed υποστηρίζει κανονικές εκφράσεις (REGEX). Αυτά σας επιτρέπουν να ορίσετε μοτίβα σε κείμενο, χρησιμοποιώντας μια ειδική και περίπλοκη σύνταξη.

Ακολουθεί ένα παράδειγμα για το πώς μπορεί να λειτουργήσει. Θα πάρουμε τους προαναφερθέντες στίχους τραγουδιού, αλλά χρησιμοποιήστε το regex για να εκτυπώσετε κάθε γραμμή που όχι ξεκινήστε με το "Take".

γάτα tom.txt | sed / ^ Λήψη / d
sed-regex-λήψη

Το Sed είναι, φυσικά, απίστευτα χρήσιμο. Αλλά είναι ακόμα πιο ισχυρό όταν συνδυάζεται με το Awk.

Τι είναι το Awk;

Ωχ!, όπως το Sed, είναι μια γλώσσα προγραμματισμού που έχει σχεδιαστεί για την αντιμετώπιση μεγάλων σωμάτων κειμένου. Αλλά ενώ το Sed χρησιμοποιείται για την επεξεργασία και την τροποποίηση κειμένου, το Awk χρησιμοποιείται ως εργαλείο για ανάλυση και αναφορά.

Όπως και ο Sed, το Awk αναπτύχθηκε για πρώτη φορά στο Bell Labs στη δεκαετία του 1970. Το όνομά του δεν προέρχεται από το πρόγραμμα κάνει, αλλά μάλλον τα επώνυμα καθενός από τους συγγραφείς - Alfred Aho, Peter Weinberger και Brian Kernaghan.

Το Awk λειτουργεί διαβάζοντας ένα αρχείο κειμένου ή μια ροή εισόδου μία γραμμή κάθε φορά. Κάθε γραμμή σαρώνεται για να δει αν ταιριάζει με ένα προκαθορισμένο μοτίβο. Εάν βρεθεί ένας αγώνας, εκτελείται μια ενέργεια.

Αλλά ενώ οι Sed και Awk μπορούν να μοιράζονται παρόμοιους σκοπούς, είναι δύο εντελώς διαφορετικές γλώσσες, με δύο εντελώς διαφορετικές φιλοσοφίες σχεδιασμού. Το Awk μοιάζει περισσότερο με μερικά γλώσσες γενικού σκοπού Πώς να επιλέξετε μια γλώσσα προγραμματισμού για να μάθετε σήμερα και να αποκτήσετε μια εξαιρετική δουλειά σε 2 χρόνιαΜπορεί να χρειαστούν χρόνια αφοσιωμένης εργασίας για να γίνει ένας πραγματικά καλός προγραμματιστής. έτσι υπάρχει τρόπος να επιλέξετε τη σωστή γλώσσα για να ξεκινήσετε από σήμερα, προκειμένου να προσληφθείτε αύριο; Διαβάστε περισσότερα , όπως οι C, Python και Bash. Έχει πράγματα όπως συναρτήσεις και μια προσέγγιση C-like σε πράγματα όπως επανάληψη και μεταβλητές (James Bruce εξήγησε πώς λειτουργεί η επανάληψη Τα απόλυτα βασικά του προγραμματισμού για αρχάριους (Μέρος 2)Στο μέρος 2 του απόλυτου οδηγού για αρχάριους για τον προγραμματισμό, θα καλύψω τα βασικά των συναρτήσεων, των τιμών επιστροφής, των βρόχων και των προϋποθέσεων. Βεβαιωθείτε ότι έχετε διαβάσει το μέρος 1 πριν το αντιμετωπίσετε, όπου εξήγησα το ... Διαβάστε περισσότερα ). Με απλά λόγια, αισθάνεται περισσότερο σαν γλώσσα προγραμματισμού.

Ας το δοκιμάσουμε λοιπόν. Χρησιμοποιώντας τους στίχους για το Take On Me, θα εκτυπώσουμε όλες τις γραμμές που έχουν περισσότερους από 20 χαρακτήρες.

awk 'μήκος ($ 0)> 80' tom.txt αμήχανο

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

{για (i = 1; i <= NF; i ++) συχνότητα [$ i] ++ }
ΤΕΛΟΣ {για (word in freq) printf "% s \ t% d \ n", word, freq [word] }

Αποθηκεύστε το και, στη συνέχεια, εκτελέστε το με την ακόλουθη εντολή.

awk -f WordCount.awk tom.txt

awk-wordcount
Εντάξει, σωστά; Πιθανότατα θα παρατηρήσετε ότι δεν έχουν καμία παραγγελία. Εσείς μπορώ ταξινομήστε τα αποτελέσματα χρησιμοποιώντας το βοηθητικό πρόγραμμα ταξινόμησης Unix. Αλλά θα το αφήσουμε για άλλη μια μέρα. Θα το κρατήσουμε απλό.

Συνδυάζοντας τα δύο

Οι Awk και Sed είναι και οι δύο εξαιρετικά ισχυροί όταν συνδυάζονται. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας σωλήνες Unix. Αυτά είναι τα "|" bits μεταξύ εντολών.

Ας δοκιμάσουμε αυτό: Θα αναφέρουμε όλες τις γραμμές στο Take On Me που έχουν περισσότερους από 20 χαρακτήρες, χρησιμοποιώντας το Awk. Στη συνέχεια, θα αφαιρέσουμε όλες τις γραμμές που ξεκινούν "Παίρνω". Μαζί, όλα μοιάζουν με αυτό:

awk 'μήκος ($ 0)> 20' tom.txt | sed / ^ Λήψη / d

Και παράγει αυτό:

awk-length-sed

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

γάτα tom.txt | sed / ^ Λήψη / d | awk -f WordCount.awk
awk-wordcount-sed

Η δύναμη του Sed και του Awk

Υπάρχουν μόνο τόσα πολλά που μπορείτε να εξηγήσετε σε ένα άρθρο. Αλλά ελπίζω να έχω απεικονίσει πόσο απίστευτα ισχυρά είναι οι Sed και Awk. Με απλά λόγια, είναι ένα εργοστάσιο επεξεργασίας κειμένου.

Λοιπόν, γιατί πρέπει να σας ενδιαφέρει; Λοιπόν, εκτός από το γεγονός ότι ποτέ δεν γνωρίζετε πότε πρέπει να κάνετε προβλέψιμες, επαναλαμβανόμενες αλλαγές σε ένα έγγραφο κειμένου, οι Sed και Awk είναι ιδανικοί για την ανάλυση αρχείων καταγραφής. Αυτό είναι ιδιαίτερα βολικό όταν προσπαθείτε να διορθώσετε ένα πρόβλημα στον διακομιστή LAMP Έχετε εγγραφεί για Φιλοξενία Ιστού μόνο για SSH; Μην ανησυχείτε - Εγκαταστήστε εύκολα οποιοδήποτε λογισμικό WebΔεν ξέρετε το πρώτο πράγμα για τη λειτουργία του Linux μέσω της ισχυρής γραμμής εντολών του; Μην ανησυχείτε πια. Διαβάστε περισσότερα ή κοιτάζοντας τα αρχεία καταγραφής πρόσβασης για να δείτε εάν ο διακομιστής σας έχει παραβιαστεί.

Βρήκατε μια ενδιαφέρουσα χρήση για τους Sed και Awk; Υπάρχουν άλλα βοηθητικά προγράμματα Linux που πιστεύετε ότι υποτιμούνται; Ενημερώστε με στα παρακάτω σχόλια και θα συζητήσουμε.

Ο Matthew Hughes είναι προγραμματιστής λογισμικού και συγγραφέας από το Λίβερπουλ της Αγγλίας. Σπάνια βρέθηκε χωρίς ένα φλιτζάνι ισχυρό μαύρο καφέ στο χέρι του και λατρεύει απολύτως το Macbook Pro και την κάμερα του. Μπορείτε να διαβάσετε το ιστολόγιό του στο http://www.matthewhughes.co.uk και ακολουθήστε τον στο twitter στο @matthewhughes.