Χρησιμοποιήστε τους σωλήνες Linux για να χορογράψετε πώς η γραμμή εντολώνβοηθητικά προγράμματα συνεργάζονται. Απλοποιήστε τις πολύπλοκες διαδικασίες και αυξήστε την παραγωγικότητά σας, εκμεταλλευόμενοι μια συλλογή από ανεξάρτητες εντολές και μετατρέποντάς τις σε μία ενιαία ομάδα. Σας δείχνουμε πώς.
Οι σωλήνες είναι παντού
Οι σωληνώσεις είναι μία από τις πιο χρήσιμες εντολέςχαρακτηριστικά που διαθέτουν τα λειτουργικά συστήματα Linux και Unix. Οι σωληνώσεις χρησιμοποιούνται με αμέτρητους τρόπους. Κοιτάξτε οποιοδήποτε άρθρο γραμμής εντολών Linux-σε οποιαδήποτε τοποθεσία Web, όχι μόνο τη δική μας - και θα δείτε ότι οι σωλήνες εμφανίζονται πιο συχνά από ό, τι δεν είναι. Αναθεώρησα ορισμένα από τα άρθρα του Linux για το How-To Geek και οι σωλήνες χρησιμοποιούνται σε όλα αυτά, με τον ένα ή τον άλλο τρόπο.
Οι σωλήνες Linux σάς επιτρέπουν να εκτελείτε ενέργειες που είναιδεν υποστηρίζεται εκτός πλαισίου από το κέλυφος. Αλλά επειδή η φιλοσοφία σχεδιασμού του Linux είναι να έχει πολλές μικρές επιχειρήσεις κοινής ωφέλειας που εκτελούν την αποκλειστική λειτουργία τους πολύ καλά και χωρίς περιττή λειτουργικότητα - το "κάνουμε ένα πράγμα και το κάνουμε καλά" μάντρα - μπορείτε να βάλετε τις χορδές των εντολών μαζί με τους σωλήνες έτσι ώστε η έξοδος μιας εντολής γίνεται η είσοδος άλλου. Κάθε εντολή που διοχετεύετε φέρνει το μοναδικό της ταλέντο στην ομάδα και σύντομα θα διαπιστώσετε ότι έχετε συγκεντρώσει μια νικήτρια ομάδα.
Ένα απλό παράδειγμα
Ας υποθέσουμε ότι έχουμε έναν κατάλογο γεμάτο από πολλούςδιαφορετικούς τύπους αρχείων. Θέλουμε να μάθουμε πόσα αρχεία συγκεκριμένου τύπου βρίσκονται σε αυτόν τον κατάλογο. Υπάρχουν άλλοι τρόποι να το κάνετε αυτό, αλλά το αντικείμενο αυτής της άσκησης είναι να εισαγάγετε σωλήνες, επομένως θα το κάνουμε με σωλήνες.
Μπορούμε να πάρετε μια λίστα των αρχείων εύκολα χρησιμοποιώντας ls
:
ls
Για να διαχωρίσετε τον τύπο του φακέλου ενδιαφέροντος, θα χρησιμοποιήσουμε grep
. Θέλουμε να βρούμε αρχεία που έχουν τη λέξη "σελίδα" στο όνομα αρχείου ή την επέκταση αρχείου.
Θα χρησιμοποιήσουμε τον ειδικό χαρακτήρα του κελύφους "|
"Για να διοχετεύσει την έξοδο από ls
σε grep
.
ls | grep "page"
grep
εκτυπώνει γραμμές που ταιριάζουν με το πρότυπο αναζήτησης. Έτσι, αυτό μας δίνει μια λίστα που περιέχει μόνο ".page" αρχεία.
Ακόμα και αυτό το ασήμαντο παράδειγμα δείχνει τη λειτουργικότητα των σωλήνων. Η έξοδος από ls
δεν στάλθηκε στο παράθυρο τερματικού. Στέλλεται grep
ως δεδομένα για το grep
εντολή για να εργαστείτε με. Η έξοδος που βλέπουμε προέρχεται από grep,
που είναι η τελευταία εντολή στην αλυσίδα.
Επέκταση της αλυσίδας μας
Ας αρχίσουμε να επεκτείνουμε την αλυσίδα των σωληνωτών εντολών. Μπορούμε να μετρήσουμε τα αρχεία ".page" προσθέτοντας το wc
εντολή. Θα χρησιμοποιήσουμε το -l
(σειρά μετρήσεων) με wc
. Σημειώστε ότι προσθέσαμε επίσης το -l
(μεγάλη μορφή) επιλογή ls
. Θα το χρησιμοποιήσουμε σύντομα.
ls - | grep "page" | wc -l
grep
δεν είναι πλέον η τελευταία εντολή στην αλυσίδα, οπότε δεν βλέπουμε την παραγωγή της. Η έξοδος από grep
τροφοδοτείται στο wc
εντολή. Η έξοδος που βλέπουμε στο παράθυρο του τερματικού είναι από wc
. wc
αναφέρει ότι υπάρχουν 69 αρχεία ".page" στον κατάλογο.
Ας επεκταθούμε πάλι τα πράγματα. Θα το πάρουμε wc
εντολή από τη γραμμή εντολών και να την αντικαταστήσετε awk
. Υπάρχουν έξι στήλες στην έξοδο από το ls
με το -l
(επιλογή μεγάλου μεγέθους). Θα χρησιμοποιήσουμε awk
για να εκτυπώσετε στήλες πέντε, τρία και εννέα. Αυτά είναι το μέγεθος, ο ιδιοκτήτης και το όνομα του αρχείου.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}'
Παίρνουμε μια λίστα αυτών των στηλών, για κάθε ένα από τα αντίστοιχα αρχεία.
Θα περάσουμε τώρα αυτή την έξοδο μέσω του sort
εντολή. Θα χρησιμοποιήσουμε το -n
(αριθμητική) επιλογή sort
γνωρίζετε ότι η πρώτη στήλη πρέπει να αντιμετωπίζεται ως αριθμοί.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n
Η έξοδος είναι τώρα ταξινομημένη σε σειρά μεγέθους αρχείου, με την εξατομικευμένη επιλογή μας από τρεις στήλες.
Προσθήκη άλλης εντολής
Θα τελειώσουμε προσθέτοντας το tail
εντολή. Θα την ενημερώσουμε να αναγράφει τις τελευταίες πέντε γραμμές παραγωγής μόνο.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n | tail -5
Αυτό σημαίνει ότι η εντολή μας μεταφράζεται σε κάτιόπως "δείξτε μου τα πέντε μεγαλύτερα αρχεία" .page "σε αυτόν τον κατάλογο, ταξινομημένα κατά μέγεθος." Φυσικά, δεν υπάρχει εντολή να το επιτύχουμε, αλλά χρησιμοποιώντας σωληνώσεις, δημιουργήσαμε το δικό μας. Θα μπορούσαμε να προσθέσουμε αυτήν τη λειτουργία - ή οποιαδήποτε άλλη μακρά εντολή - ως λειτουργία ψευδωνύμου ή κελύφους για να αποθηκεύσουμε όλη την πληκτρολόγηση.
Εδώ είναι η έξοδος:
Θα μπορούσαμε να αντιστρέψουμε τη σειρά μεγέθους προσθέτοντας το -r
(αντίστροφη) επιλογή στο sort
εντολή και χρήση head
αντί tail
για να επιλέξετε τις γραμμές από την κορυφή της εξόδου.
Αυτή τη φορά τα πέντε μεγαλύτερα αρχεία ".page" παρατίθενται από το μεγαλύτερο σε μικρότερο:
Ορισμένα πρόσφατα παραδείγματα
Ακολουθούν δύο ενδιαφέροντα παραδείγματα από τα πρόσφατα άρθρα για το How-To geek.
Ορισμένες εντολές, όπως το xargs
εντολή, έχουν σχεδιαστεί για να έχουν εισροή piped σε αυτές. Εδώ είναι ένας τρόπος που μπορούμε να έχουμε wc
μετρήστε τις λέξεις, τους χαρακτήρες και τις γραμμές σε πολλά αρχεία, με σωληνώσεις ls
σε xargs
το οποίο στη συνέχεια τροφοδοτεί τη λίστα με τα ονόματα αρχείων wc
σαν να είχαν περάσει wc
ως παραμέτρους γραμμής εντολών.
ls *.page | xargs wc
Οι συνολικοί αριθμοί λέξεων, χαρακτήρων και γραμμών παρατίθενται στο κάτω μέρος του παραθύρου τερματικού.
Ακολουθεί ένας τρόπος για να αποκτήσετε μια ταξινομημένη λίστα των μοναδικών επεκτάσεων αρχείων στον τρέχοντα κατάλογο, με έναν αριθμό κάθε τύπου.
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c
Πολλά συμβαίνουν εδώ.
- ls: Εμφανίζει τα αρχεία στον κατάλογο
- στροφή μηχανής: Αντιστρέφει το κείμενο στα ονόματα αρχείων.
- Τομή: Κόβει τη συμβολοσειρά κατά την πρώτη εμφάνιση του καθορισμένου οριοθέτη ".". Το κείμενο μετά από αυτό απορρίπτεται.
- στροφή μηχανής: Αντιστρέφει το υπόλοιπο κείμενο, το οποίο είναι η επέκταση του αρχείου.
- είδος: Ταξινόμηση της λίστας αλφαβητικά.
- uniq: Μετρώνει τον αριθμό κάθε μοναδικής καταχώρησης στη λίστα.
Η έξοδος εμφανίζει τη λίστα των επεκτάσεων αρχείων, ταξινομημένη αλφαβητικά με μια καταμέτρηση κάθε μοναδικού τύπου.
Ονομασμένοι σωλήνες
Υπάρχει ένας άλλος τύπος σωλήνα που είναι διαθέσιμος σε εμάς,ονομαζόμενες ονομαζόμενες σωλήνες. Οι σωλήνες στα προηγούμενα παραδείγματα δημιουργούνται επί τόπου από το κέλυφος όταν επεξεργάζονται τη γραμμή εντολών. Οι σωλήνες δημιουργούνται, χρησιμοποιούνται και στη συνέχεια απορρίπτονται. Είναι παροδικά και δεν αφήνουν κανένα ίχνος του εαυτού τους. Αυτά υπάρχουν μόνο για όσο διάστημα τρέχει η εντολή που τους χρησιμοποιεί.
Οι ονομαζόμενες σωλήνες εμφανίζονται ως επίμονα αντικείμενα στο σύστημα αρχείων, ώστε να μπορείτε να τα δείτε χρησιμοποιώντας ls
. Είναι επίμονες επειδή θα επιβιώσουν σε μια επανεκκίνηση του υπολογιστή-αν και τυχόν μη αναγνωσμένα δεδομένα τους σε εκείνη την εποχή θα απορριφθούν.
Ονομασμένοι σωλήνες χρησιμοποιήθηκαν πολύ κάθε φορά για να το επιτρέψουνδιαφορετικές διεργασίες για την αποστολή και λήψη δεδομένων, αλλά δεν τις έχω δει να χρησιμοποιούνται με αυτόν τον τρόπο εδώ και πολύ καιρό. Δεν υπάρχει αμφιβολία ότι υπάρχουν άνθρωποι εκεί έξω που εξακολουθούν να τις χρησιμοποιούν με μεγάλη επιτυχία, αλλά δεν έχω συναντήσει κανένα πρόσφατα. Αλλά για λόγους πληρότητας, ή απλώς για να ικανοποιήσετε την περιέργειά σας, εδώ μπορείτε να τα χρησιμοποιήσετε.
Ονομασμένοι σωλήνες δημιουργούνται με το mkfifo
εντολή. Αυτή η εντολή θα δημιουργήσει έναν ονομασμένο σωλήνα που ονομάζεται "geek-pipe" στον τρέχοντα κατάλογο.
mkfifo geek-pipe
Μπορούμε να δούμε τις λεπτομέρειες του ονομασμένου σωλήνα εάν χρησιμοποιήσουμε το ls
εντολή με το -l
(μεγάλη μορφή):
ls -l geek-pipe
Ο πρώτος χαρακτήρας της λίστας είναι "p", που σημαίνει ότι είναι ένας σωλήνας. Αν ήταν "d", θα σήμαινε ότι το αντικείμενο του συστήματος αρχείων είναι ένας κατάλογος και μια παύλα "-" θα σήμαινε ότι είναι ένα κανονικό αρχείο.
Χρησιμοποιώντας το Named Pipe
Ας χρησιμοποιήσουμε το σωλήνα μας. Οι ανώνυμοι σωλήνες που χρησιμοποιήσαμε στα προηγούμενα παραδείγματα μας πέρασαν τα δεδομένα αμέσως από την εντολή αποστολής στην εντολή λήψης. Τα δεδομένα που αποστέλλονται μέσω ενός ονομασμένου σωλήνα θα παραμείνουν στον σωλήνα μέχρι να διαβάσουν. Τα δεδομένα διατηρούνται στην μνήμη, οπότε το μέγεθος του ονομασμένου σωλήνα δεν θα μεταβληθεί ls
καταχωρίσετε αν υπάρχουν δεδομένα ή όχι.
Θα χρησιμοποιήσουμε δύο παράθυρα τερματικών για αυτό το παράδειγμα. Θα χρησιμοποιήσω την ετικέτα:
# Terminal-1
σε ένα παράθυρο τερματικού και
# Terminal-2
στο άλλο, ώστε να μπορείτε να διαφοροποιήσετε μεταξύ τους. Το hash "#" λέει στο κέλυφος ότι αυτό που ακολουθεί είναι ένα σχόλιο και να το αγνοήσουμε.
Ας πάρουμε το σύνολο του προηγούμενου παραδείγματός μας και ανακατευθύνουμε αυτό στο όνομα του σωλήνα. Επομένως, χρησιμοποιούμε και τους δύο ανώνυμους και ονομασμένους σωλήνες σε μία εντολή:
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c > geek-pipe
Δεν θα συμβεί τίποτα πολύ να συμβεί. Ίσως παρατηρήσετε ότι δεν επιστρέφετε στην εντολή εντολών αν και κάτι συμβαίνει.
Στο άλλο παράθυρο τερματικού, εκδώστε αυτήν την εντολή:
cat < geek-pipe
Ανακατευθύνουμε τα περιεχόμενα του ονομασμένου σωλήνα cat
, έτσι ώστε cat
θα εμφανίσει αυτό το περιεχόμενο στο δεύτερο παράθυρο τερματικού. Εδώ είναι η έξοδος:
Και θα δείτε ότι έχετε επιστρέψει στη γραμμή εντολών στο πρώτο παράθυρο τερματικού.
Λοιπόν, αυτό που συνέβη.
- Μετακινήσαμε κάποια έξοδο στον ονομαζόμενο σωλήνα.
- Το πρώτο παράθυρο του τερματικού δεν επέστρεψε στη γραμμή εντολών.
- Τα δεδομένα παρέμειναν στον σωλήνα μέχρι να διαβαστεί από το σωλήνα στο δεύτερο τερματικό.
- Μας επέστρεψε στη γραμμή εντολών στο πρώτο παράθυρο τερματικού.
Μπορεί να σκέφτεστε ότι θα μπορούσατε να εκτελέσετε την εντολή στο πρώτο παράθυρο τερματικού ως εργασία στο παρασκήνιο προσθέτοντας ένα &
μέχρι το τέλος της εντολής. Και θα είχες δίκιο. Σε αυτή την περίπτωση, θα είχαμε επιστρέψει αμέσως στη γραμμή εντολών.
Το σημείο του δεν χρησιμοποιώντας την επεξεργασία υποβάθρου ήταν να υπογραμμίσει ότι ένας ονομασμένος σωλήνας είναι a διαδικασία αποκλεισμού. Βάζοντας κάτι σε ένα όνομα σωλήνα ανοίγει μόνοένα άκρο του σωλήνα. Το άλλο άκρο δεν ανοίγει μέχρι το πρόγραμμα ανάγνωσης να αποσπά τα δεδομένα. Ο πυρήνας αναστέλλει τη διαδικασία στο πρώτο παράθυρο τερματικού μέχρι να διαβαστούν τα δεδομένα από το άλλο άκρο του σωλήνα.
Η Δύναμη των Σωλήνων
Σήμερα, οι ονομαζόμενες σωλήνες είναι κάτι νεωτεριστικής δράσης.
Οι απλοί παλιοί σωλήνες Linux, από την άλλη πλευρά, είναι έναςαπό τα πιο χρήσιμα εργαλεία που μπορείτε να έχετε στην εργαλειοθήκη παραθύρου τερματικού. Η γραμμή εντολών Linux αρχίζει να ζωντανεύει για εσάς και παίρνετε ένα εντελώς νέο power-up όταν μπορείτε να ενορχηστρώσετε μια συλλογή εντολών για να δημιουργήσετε μια συνεκτική απόδοση.
Συμβουλή χωρισμού: Είναι καλύτερο να γράψετε τις εντολές με σωλήνες προσθέτοντας μία εντολή τη φορά και να λειτουργήσει αυτό το τμήμα και στη συνέχεια να διοχετεύσετε στην επόμενη εντολή.