15 Συμβουλές εντολών Sed για εργασίες διαχείρισης συστήματος Linux


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

Σε αυτό το άρθρο θα εξετάσουμε το sed, το γνωστό πρόγραμμα επεξεργασίας ροής, και θα μοιραστούμε 15 συμβουλές για να το χρησιμοποιήσετε για να επιτύχετε τους στόχους που αναφέρθηκαν προηγουμένως και όχι μόνο.

Τι είναι το Sed Command;

Η εντολή 'sed', συντομογραφία για το πρόγραμμα επεξεργασίας ροής, είναι ένα ευέλικτο και ισχυρό εργαλείο χειρισμού κειμένου που λειτουργεί σε ροές κειμένου, επιτρέποντας στους χρήστες να εκτελούν διάφορες λειτουργίες σε δεδομένα, όπως αναζήτηση, αντικατάσταση, εισαγωγή και διαγράφω. Το "Sed" χρησιμοποιεί κανονικές εκφράσεις για να ορίσει μοτίβα για χειρισμό κειμένου και μπορεί να χρησιμοποιηθεί για εργασίες μαζικής επεξεργασίας και επεξεργασία κειμένου σε σενάρια.

Ένα από τα αξιοσημείωτα χαρακτηριστικά του είναι η επιτόπια επεξεργασία, όπου μπορεί να τροποποιεί απευθείας αρχεία ή να δημιουργεί αντίγραφα ασφαλείας κατά την πραγματοποίηση αλλαγών. Το ‘Sed’ είναι ένα απαραίτητο εργαλείο για διαχειριστές συστήματος, προγραμματιστές και οποιονδήποτε ασχολείται με εργασίες μετασχηματισμού κειμένου και χειρισμού δεδομένων στη γραμμή εντολών.

Ακολουθούν ορισμένες κοινές εντολές «sed» με παραδείγματα:

1. Προβολή εύρους γραμμών ενός αρχείου

Εργαλεία όπως το κεφάλι και η ουρά μας επιτρέπουν να προβάλουμε το κάτω ή το επάνω μέρος ενός αρχείου. Τι γίνεται αν χρειαστεί να δούμε μια ενότητα στη μέση; Το παρακάτω sed one-liner θα επιστρέψει τις γραμμές 5 έως 10 από το tecmint.txt:

sed -n '5,10p' tecmint.txt

2. Προβολή ολόκληρου του αρχείου εκτός από ένα δεδομένο εύρος

Από την άλλη πλευρά, είναι πιθανό να θέλετε να εκτυπώσετε ολόκληρο το αρχείο εκτός από ένα συγκεκριμένο εύρος. Για να εξαιρέσετε τις γραμμές 20 έως 35 από το tecmint.txt, κάντε:

sed '20,35d' myfile.txt

3. Προβολή μη διαδοχικών γραμμών και εύρους

Είναι πιθανό να σας ενδιαφέρει ένα σύνολο μη διαδοχικών γραμμών ή για περισσότερα από ένα εύρη. Ας εμφανίσουμε τις γραμμές 5-7 και 10-13 από το tecmint.txt:

sed -n -e '5,7p' -e '10,13p' tecmint.txt

Όπως μπορείτε να δείτε, η επιλογή -e μας επιτρέπει να εκτελέσουμε μια δεδομένη ενέργεια (σε αυτήν την περίπτωση, γραμμές εκτύπωσης) για κάθε εύρος.

4. Αντικατάσταση λέξεων ή συμβολοσειρών σε ένα αρχείο

Για να αντικαταστήσετε κάθε εμφάνιση της λέξης έκδοση με story στο tecmint.txt, κάντε:

sed 's/version/story/g' tecmint.txt

Επιπλέον, μπορεί να θέλετε να χρησιμοποιήσετε το gi αντί για το g για να αγνοήσετε πεζούς χαρακτήρες:

sed 's/version/story/gi' myfile.txt

Για να αντικαταστήσουμε πολλαπλά κενά με ένα μόνο διάστημα, θα χρησιμοποιήσουμε την έξοδο της εντολής ip route show με μια διοχέτευση:

ip route show | sed 's/  */ /g'

Συγκρίνετε την έξοδο του ip route show με και χωρίς το pipeline:

5. Αντικατάσταση λέξεων ή συμβολοσειρών εντός εύρους

Εάν σας ενδιαφέρει να αντικαταστήσετε λέξεις μόνο εντός εύρους γραμμής (30 έως 40, για παράδειγμα), μπορείτε να κάνετε:

sed '30,40 s/version/story/g' tecmint.txt

Φυσικά, μπορείτε να υποδείξετε μια γραμμή μέσω του αντίστοιχου αριθμού αντί για ένα εύρος.

6. Καταργήστε τα σχόλια από ένα αρχείο

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

Για να αφαιρέσετε κενές γραμμές ή αυτές που ξεκινούν με # από το αρχείο διαμόρφωσης του Apache, κάντε:

sed '/^#\|^$\| *#/d' httpd.conf

Το σύμβολο του καρέ ακολουθείται από το αριθμητικό σύμβολο (^#) υποδηλώνει την αρχή μιας γραμμής, ενώ το ^$ αντιπροσωπεύει κενές γραμμές. Οι κάθετες ράβδοι υποδεικνύουν λειτουργίες boolean, ενώ η κάθετο προς τα πίσω χρησιμοποιείται για διαφυγή από τις κάθετες ράβδους.

Στη συγκεκριμένη περίπτωση, το αρχείο διαμόρφωσης Apache έχει γραμμές με #'s όχι στην αρχή ορισμένων γραμμών, επομένως το *# χρησιμοποιείται επίσης για την κατάργηση αυτών.

7. Αντικαταστήστε μια λέξη χωρίς διάκριση πεζών-κεφαλαίων σε ένα αρχείο

Για να αντικαταστήσουμε μια λέξη που αρχίζει με κεφαλαία ή πεζά με μια άλλη λέξη, μπορούμε επίσης να χρησιμοποιήσουμε το sed. Για να το επεξηγήσουμε, ας αντικαταστήσουμε τη λέξη zip ή Zip με rar στο tecmint.txt:

sed 's/[Zz]ip/rar/g' tecmint.txt

8. Εύρεση συγκεκριμένων συμβάντων σε ένα αρχείο καταγραφής

Μια άλλη χρήση του sed συνίσταται στην εκτύπωση των γραμμών από ένα αρχείο που ταιριάζουν με μια δεδομένη κανονική έκφραση. Για παράδειγμα, μπορεί να μας ενδιαφέρει να δούμε τις δραστηριότητες εξουσιοδότηση και έλεγχος ταυτότητας που πραγματοποιήθηκαν στις 2 Ιουλίου, σύμφωνα με το /var /log/secure συνδεθείτε σε έναν διακομιστή CentOS.

Σε αυτήν την περίπτωση, το μοτίβο για αναζήτηση είναι 2 Ιουλίου στην αρχή κάθε γραμμής:

sed -n '/^Jul  1/ p' /var/log/secure

9. Εισαγωγή διαστημάτων ή κενών γραμμών σε ένα αρχείο

Με το sed, μπορούμε επίσης να εισαγάγουμε κενά (κενές γραμμές) για κάθε μη κενή γραμμή σε ένα αρχείο. Για να εισαγάγετε μια κενή γραμμή κάθε άλλη γραμμή στο LICENSE, ένα αρχείο απλού κειμένου, κάντε τα εξής:

sed G tecmint.txt

Για να εισαγάγετε δύο κενές γραμμές, κάντε:

sed 'G;G' tecmint.txt

Προσθέστε ένα κεφαλαίο G που χωρίζεται με ερωτηματικό εάν θέλετε να προσθέσετε περισσότερες κενές γραμμές. Η παρακάτω εικόνα απεικονίζει το παράδειγμα που περιγράφεται σε αυτήν την συμβουλή:

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

10. Αφαίρεση ^M σε αρχείο

Το πρόγραμμα dos2unix μετατρέπει αρχεία απλού κειμένου από μορφοποίηση Windows/Mac σε Unix/Linux, αφαιρώντας τους κρυφούς χαρακτήρες νέας γραμμής που έχουν εισαχθεί από ορισμένα προγράμματα επεξεργασίας κειμένου που χρησιμοποιούνται σε αυτές τις πλατφόρμες. Εάν δεν είναι εγκατεστημένο στο σύστημά σας Linux, μπορείτε να μιμηθείτε τη λειτουργικότητά του με το sed αντί να το εγκαταστήσετε.

Στην εικόνα στα αριστερά μπορούμε να δούμε αρκετούς χαρακτήρες νέας γραμμής DOS (^M), οι οποίοι αργότερα αφαιρέθηκαν με:

sed -i 's/\r//' myfile.txt

Λάβετε υπόψη ότι η επιλογή -i υποδηλώνει επιτόπια επεξεργασία. Στη συνέχεια, οι αλλαγές δεν θα επιστρέψουν στην οθόνη αλλά θα αποθηκευτούν στο αρχείο.

Σημείωση: Μπορείτε να εισαγάγετε χαρακτήρες νέας γραμμής DOS κατά την επεξεργασία ενός αρχείου στο πρόγραμμα επεξεργασίας Vim με Ctrl+V και Ctrl+M.

11. Δημιουργήστε ένα αρχείο αντιγράφου ασφαλείας με την εντολή Sed

Στην προηγούμενη συμβουλή, χρησιμοποιήσαμε το sed για να τροποποιήσουμε ένα αρχείο, αλλά δεν αποθηκεύσαμε το αρχικό αρχείο. Μερικές φορές είναι καλή ιδέα να αποθηκεύσετε ένα αντίγραφο ασφαλείας του αρχικού αρχείου για παν ενδεχόμενο.

Για να το κάνετε αυτό, υποδείξτε ένα επίθημα μετά την επιλογή -i (μέσα σε μεμονωμένα εισαγωγικά) που θα χρησιμοποιηθεί για τη μετονομασία του αρχικού αρχείου.

Στο παρακάτω παράδειγμα, θα αντικαταστήσουμε όλες τις παρουσίες του αυτό ή του Αυτό (παράβλεψη πεζών-κεφαλαίων) με αυτό στο myfile.txt και θα αποθηκεύσουμε το αρχικό αρχείο ως myfile.txt.orig.

Τέλος, θα χρησιμοποιήσουμε το βοηθητικό πρόγραμμα diff για να εντοπίσουμε τις διαφορές μεταξύ των δύο αρχείων:

sed -i'.orig' 's/this/that/gi' myfile.txt

12. Εναλλαγή ζευγών λέξεων σε ένα αρχείο

Ας υποθέσουμε ότι έχετε ένα αρχείο που περιέχει πλήρη ονόματα στη μορφή Όνομα, Επώνυμο. Για να επεξεργαστείτε επαρκώς το αρχείο, μπορεί να θέλετε να αλλάξετε Επώνυμο και Όνομα.

Μπορούμε να το κάνουμε αυτό με το sed αρκετά εύκολα:

sed 's/^\(.*\),\(.*\)$/\, /g' names.txt

Στην παραπάνω εικόνα μπορούμε να δούμε ότι οι παρενθέσεις, καθώς είναι ειδικοί χαρακτήρες, πρέπει να διαφεύγουν, όπως και οι αριθμοί 1 και 2.

Αυτοί οι αριθμοί αντιπροσωπεύουν τις επισημασμένες κανονικές εκφράσεις (οι οποίες πρέπει να εμφανίζονται μέσα σε παρενθέσεις):

  • Το 1 αντιπροσωπεύει την αρχή κάθε γραμμής μέχρι το κόμμα.
  • Το 2 είναι ένα σύμβολο κράτησης θέσης για όλα όσα βρίσκονται δεξιά από το κόμμα στο τέλος της γραμμής.

Η επιθυμητή έξοδος υποδεικνύεται με τη μορφή ΔεύτερηΣτήλη (Επώνυμο) + κόμμα + κενό + ΠρώτηΣτήλη (Όνομα). Μη διστάσετε να το αλλάξετε σε ό,τι θέλετε.

13. Αντικατάσταση λέξεων μόνο εάν βρεθεί χωριστή αντιστοίχιση

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

Για παράδειγμα, μπορεί να θέλουμε να αντικαταστήσουμε το start με το stop μόνο εάν η λέξη υπηρεσίες βρίσκεται στην ίδια γραμμή. Σε αυτό το σενάριο, ορίστε τι θα συμβεί:

We need to start partying at work,
but let’s remember to start all services first.

Στην πρώτη γραμμή, το start δεν θα αντικατασταθεί με το stop καθώς η λέξη υπηρεσίες δεν εμφανίζεται σε αυτήν τη γραμμή, σε αντίθεση με τη δεύτερη γραμμή.

sed '/services/ s/start/stop/g' msg.txt

14. Εκτέλεση δύο ή περισσότερων αντικαταστάσεων ταυτόχρονα

Μπορείτε να συνδυάσετε δύο ή περισσότερες αντικαταστάσεις σε μία μόνο εντολή sed. Ας αντικαταστήσουμε τις λέξεις that και line στο myfile.txt με This και verse, αντίστοιχα.

Σημειώστε πώς μπορεί να γίνει αυτό χρησιμοποιώντας μια συνηθισμένη εντολή αντικατάστασης sed ακολουθούμενη από ένα ερωτηματικό και μια δεύτερη εντολή αντικατάστασης:

sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt

Αυτή η συμβουλή απεικονίζεται στην παρακάτω εικόνα:

15. Συνδυασμός Sed και άλλων εντολών

Φυσικά, το sed μπορεί να συνδυαστεί με άλλες εντολές Linux προκειμένου να δημιουργηθούν πιο ισχυρές εντολές. Για παράδειγμα, ας χρησιμοποιήσουμε το παράδειγμα που δίνεται στην ΣΥΜΒΟΥΛΗ #4 και ας εξαγάγουμε τη διεύθυνση IP μας από την έξοδο της εντολής ip route.

Θα ξεκινήσουμε εκτυπώνοντας μόνο τη γραμμή όπου βρίσκεται η λέξη src. Στη συνέχεια θα μετατρέψουμε πολλαπλούς χώρους σε ένα μόνο. Τέλος, θα κόψουμε το πεδίο 9ο (θεωρώντας ένα ενιαίο διάστημα ως διαχωριστικό πεδίου), όπου βρίσκεται η διεύθυνση IP:

ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

Η παρακάτω εικόνα απεικονίζει κάθε βήμα της παραπάνω εντολής:

Περίληψη

Σε αυτόν τον οδηγό, έχουμε μοιραστεί 15 sed συμβουλές και κόλπα για να σας βοηθήσουμε με τις καθημερινές σας εργασίες διαχείρισης συστήματος. Υπάρχει κάποια άλλη συμβουλή που χρησιμοποιείτε σε τακτική βάση και θα θέλατε να μοιραστείτε με εμάς και την υπόλοιπη κοινότητα;

Εάν ναι, μη διστάσετε να μας ενημερώσετε χρησιμοποιώντας την παρακάτω φόρμα σχολίων. Ερωτήσεις και σχόλια είναι επίσης ευπρόσδεκτα - ανυπομονούμε να ακούσουμε από εσάς!