Πώς να χρησιμοποιήσετε το Pipes στο Linux

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

Οι σωλήνες είναι παντού

Το Pipes είναι ένα από τα πιο χρήσιμα χαρακτηριστικά της γραμμής εντολών που διαθέτουν λειτουργικά συστήματα Linux και Unix. Οι σωλήνες χρησιμοποιούνται με αμέτρητους τρόπους. Ρίξτε μια ματιά σε οποιοδήποτε άρθρο της γραμμής εντολών Linux—σε οποιονδήποτε ιστότοπο, όχι μόνο στον δικό μας—και θα δείτε ότι οι σωλήνες εμφανίζονται πιο συχνά. Εξέτασα μερικά από τα άρθρα του How-To Geek στο Linux και σε όλα χρησιμοποιούνται σωλήνες, με τον ένα ή τον άλλο τρόπο.

Οι σωλήνες Linux σάς επιτρέπουν να εκτελείτε ενέργειες που δεν υποστηρίζονται εκ των υστέρων από το κέλυφος. Αλλά επειδή η φιλοσοφία σχεδιασμού Linux είναι να υπάρχουν πολλά μικρά βοηθητικά προγράμματα που εκτελούν τα δικά τους αποκλειστική λειτουργία πολύ καλά, και χωρίς περιττή λειτουργικότητα—το μάντρα «κάνε ένα πράγμα και κάνε το καλά»—μπορείς να συνδυάσεις σειρές εντολών μαζί με σωλήνες έτσι ώστε η έξοδος μιας εντολής να γίνει η είσοδος μιας άλλης. Κάθε εντολή που εισάγετε φέρνει το μοναδικό της ταλέντο στην ομάδα και σύντομα θα ανακαλύψετε ότι έχετε συγκεντρώσει μια ομάδα που κερδίζει.

Ένα Απλό Παράδειγμα

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

Μπορούμε να λάβουμε μια λίστα με τα αρχεία εύκολα χρησιμοποιώντας το ls:

ls

Για να διαχωρίσουμε τον τύπο αρχείου που μας ενδιαφέρει, θα χρησιμοποιήσουμε το grep. Θέλουμε να βρούμε αρχεία που έχουν τη λέξη “σελίδα” στο όνομα αρχείου ή την επέκταση αρχείου τους.

Θα χρησιμοποιήσουμε τον ειδικό χαρακτήρα του κελύφους “|” να διοχετεύσει την έξοδο από το ls στο grep.

ls | grep "page"

ls -l |  grep

Το grep εκτυπώνει γραμμές που ταιριάζει με το μοτίβο αναζήτησής του. Έτσι, αυτό μας δίνει μια λίστα που περιέχει μόνο αρχεία “.page”.

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

  Οι 4 καλύτεροι επεξεργαστές κειμένου για προγραμματιστές στο Linux

Επέκταση της Αλυσίδας μας

Ας αρχίσουμε να επεκτείνουμε την αλυσίδα των εντολών μας. Μπορούμε μετρήστε τα αρχεία “.page”. προσθέτοντας την εντολή wc. Θα χρησιμοποιήσουμε την επιλογή -l (line count) με το wc. Σημειώστε ότι έχουμε επίσης προσθέσει την επιλογή -l (μεγάλη μορφή) στο ls . Θα το χρησιμοποιήσουμε σύντομα.

ls - | grep "page" | wc -l

ls - |  grep

Το grep δεν είναι πλέον η τελευταία εντολή στην αλυσίδα, επομένως δεν βλέπουμε την έξοδο της. Η έξοδος από το grep τροφοδοτείται στην εντολή wc. Η έξοδος που βλέπουμε στο παράθυρο του τερματικού είναι από το wc. Το wc αναφέρει ότι υπάρχουν 69 αρχεία “.page” στον κατάλογο.

Ας επεκτείνουμε ξανά τα πράγματα. Θα αφαιρέσουμε την εντολή wc από τη γραμμή εντολών και θα την αντικαταστήσουμε με το awk. Υπάρχουν εννέα στήλες στην έξοδο από το ls με την επιλογή -l (μεγάλη μορφή). Θα χρησιμοποιήσουμε το awk to στήλες εκτύπωσης πέντε, τρία και εννέα. Αυτά είναι το μέγεθος, ο κάτοχος και το όνομα του αρχείου.

ls -l | grep "page" | awk '{print $5 " " $3 " " $9}'

Λαμβάνουμε μια λίστα με αυτές τις στήλες, για κάθε ένα από τα αρχεία που ταιριάζουν.

Τώρα θα περάσουμε αυτήν την έξοδο μέσω της εντολής ταξινόμησης. Θα χρησιμοποιήσουμε την επιλογή -n (αριθμητική) για να ενημερώσουμε την ταξινόμηση ότι πρέπει να είναι η πρώτη στήλη αντιμετωπίζονται ως αριθμοί.

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 (αντίστροφη) στην εντολή ταξινόμησης και χρησιμοποιώντας head αντί για ουρά για να διαλέξουμε τις γραμμές από την κορυφή της εξόδου.

Αυτή τη φορά τα πέντε μεγαλύτερα αρχεία “.page” παρατίθενται από το μεγαλύτερο στο μικρότερο:

Μερικά Πρόσφατα Παραδείγματα

Ακολουθούν δύο ενδιαφέροντα παραδείγματα από πρόσφατα άρθρα How-To geek.

Ορισμένες εντολές, όπως η εντολή xargs, έχουν σχεδιαστεί να τους έχει διοχετευτεί η είσοδος. Εδώ είναι ένας τρόπος με τον οποίο μπορούμε να μετρήσουμε το wc λέξεις, χαρακτήρες και γραμμές σε πολλαπλά αρχεία, εισάγοντας το ls σε xargs που στη συνέχεια τροφοδοτεί τη λίστα ονομάτων αρχείων στο wc σαν να είχαν περάσει στο wc ως παράμετροι γραμμής εντολών.

ls *.page | xargs wc

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

  Πώς να παίξετε βίντεο από το τερματικό στο Linux με το Mplayer

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

ls | rev | cut -d'.' -f1 | rev | sort | uniq -c

Εδώ συμβαίνουν πολλά.

ls: Εμφανίζει τα αρχεία στον κατάλογο
στροφή μηχανής: Αντιστρέφει το κείμενο στα ονόματα αρχείων.
Τομή: Κόβει το κορδόνι κατά την πρώτη εμφάνιση του καθορισμένου οριοθέτη “.”. Το κείμενο μετά από αυτό απορρίπτεται.
rev: Αντιστρέφει το υπόλοιπο κείμενο, που είναι η επέκταση ονόματος αρχείου.
sort: Ταξινομεί τη λίστα αλφαβητικά.
uniq: Μετρά τον αριθμό του καθενός μοναδική εγγραφή στη λίστα.

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

Με όνομα Pipes

Υπάρχει ένας άλλος τύπος σωλήνα στη διάθεσή μας, που λέγεται επώνυμοι σωλήνες. Οι σωλήνες στα προηγούμενα παραδείγματα δημιουργούνται on-the-fly από το κέλυφος όταν επεξεργάζεται τη γραμμή εντολών. Οι σωλήνες δημιουργούνται, χρησιμοποιούνται και στη συνέχεια απορρίπτονται. Είναι παροδικά και δεν αφήνουν ίχνη από τον εαυτό τους. Υπάρχουν μόνο για όσο διάστημα εκτελείται η εντολή που χρησιμοποιεί.

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

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

Οι επώνυμοι σωλήνες δημιουργούνται με την εντολή mkfifo. Αυτή η εντολή θα δημιουργήσει έναν επώνυμο σωλήνα ονομάζεται “geek-pipe” στον τρέχοντα κατάλογο.

mkfifo geek-pipe

Μπορούμε να δούμε τις λεπτομέρειες του ονομαζόμενου σωλήνα αν χρησιμοποιήσουμε την εντολή ls με την επιλογή -l (μεγάλη μορφή):

ls -l geek-pipe

Ο πρώτος χαρακτήρας της καταχώρισης είναι “p”, που σημαίνει ότι είναι ένας σωλήνας. Εάν ήταν “d”, θα σήμαινε ότι το αντικείμενο του συστήματος αρχείων είναι ένας κατάλογος και η παύλα “-” θα σήμαινε ότι είναι ένα κανονικό αρχείο.

Χρήση του Named Pipe

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

  Πώς να παίξετε το Orcs Must Die! 2 σε linux

Θα χρησιμοποιήσουμε δύο παράθυρα τερματικού για αυτό το παράδειγμα. Θα χρησιμοποιήσω την ετικέτα:

# Terminal-1

σε ένα παράθυρο τερματικού και

# Terminal-2

στο άλλο, ώστε να μπορείτε να τα διαφοροποιήσετε. Ο κατακερματισμός “#” λέει στο κέλυφος ότι αυτό που ακολουθεί είναι ένα σχόλιο και να το αγνοήσει.

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

ls | rev | cut -d'.' -f1 | rev | sort | uniq -c > geek-pipe

ls |  στροφές |  κόψτε -δ'.'  -f1 |  στροφές |  ταξινόμηση |  uniq -c > geek-pipe σε παράθυρο τερματικού” width=”646″ height=”97″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Δεν φαίνεται να συμβαίνει τίποτα.  Ωστόσο, μπορεί να παρατηρήσετε ότι δεν επιστρέφετε στη γραμμή εντολών, επομένως κάτι συμβαίνει.</p>
<p>Στο άλλο παράθυρο τερματικού, εκδώστε αυτήν την εντολή:</p>
<pre>cat < geek- σωλήνας</pre>
<p><img loading=

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

Και θα δείτε ότι έχετε επιστρέψει στη γραμμή εντολών στο πρώτο παράθυρο τερματικού.

Λοιπόν, αυτό που μόλις συνέβη.

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

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

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

The Power of Pipes

Σήμερα, οι επώνυμοι σωλήνες είναι κάτι σαν καινοτομία.

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

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