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

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

Εύρεση αντίστοιχων γραμμών κειμένου στο Linux

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

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

Ας το ανάψουμε!

Εκτέλεση uniq χωρίς επιλογές

Έχουμε ένα αρχείο κειμένου που περιέχει τους στίχους του του Ρόμπερτ Τζόνσον τραγούδι Πιστεύω ότι θα ξεσκονίσω τη σκούπα μου. Ας δούμε τι κάνει το uniq.

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

uniq dust-my-broom.txt | less

ο

Λαμβάνουμε ολόκληρο το τραγούδι, συμπεριλαμβανομένων των διπλών γραμμών, σε λιγότερο:

Η έξοδος από το

Αυτό δεν φαίνεται να είναι ούτε οι μοναδικές γραμμές ούτε οι διπλές γραμμές.

Σωστά—γιατί αυτή είναι η πρώτη ιδιορρυθμία. Εάν εκτελείτε το uniq χωρίς επιλογές, συμπεριφέρεται σαν να χρησιμοποιήσατε την επιλογή -u (μοναδικές γραμμές). Αυτό λέει στο uniq να εκτυπώνει μόνο τις μοναδικές γραμμές από το αρχείο. Ο λόγος που βλέπετε διπλότυπες γραμμές είναι επειδή, για να θεωρήσει το uniq μια γραμμή διπλότυπη, πρέπει να βρίσκεται δίπλα στο αντίγραφό της, όπου μπαίνει η ταξινόμηση.

  Πώς να εγκαταστήσετε την εφαρμογή αλληλογραφίας Trojita σε Linux

Όταν ταξινομούμε το αρχείο, ομαδοποιεί τις διπλότυπες γραμμές και το uniq τις αντιμετωπίζει ως διπλότυπα. Θα χρησιμοποιήσουμε ταξινόμηση στο αρχείο, θα διοχετεύσουμε την ταξινομημένη έξοδο σε uniq και, στη συνέχεια, θα διοχετεύσουμε την τελική έξοδο σε λιγότερο.

Για να το κάνουμε αυτό, πληκτρολογούμε τα εξής:

sort dust-my-broom.txt | uniq | less

ο

Μια ταξινομημένη λίστα γραμμών εμφανίζεται σε λιγότερα.

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

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

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

Πληκτρολογούμε την παρακάτω εντολή:

sort dust-my-broom.txt > sorted.txt

ο εντολή sorted.txt” σε ένα παράθυρο τερματικού.’ width=”646″ ύψος=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”>

Τώρα, έχουμε ένα προ-ταξινομημένο αρχείο για να δουλέψουμε.

Καταμέτρηση διπλότυπων

Μπορείτε να χρησιμοποιήσετε την επιλογή -c (count) για να εκτυπώσετε πόσες φορές κάθε γραμμή εμφανίζεται σε ένα αρχείο.

Πληκτρολογήστε την ακόλουθη εντολή:

uniq -c sorted.txt | less

ο

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

Έξοδος από το

Εάν θέλετε η έξοδος να ταξινομηθεί με αριθμητική σειρά, μπορείτε να τροφοδοτήσετε την έξοδο από uniq σε ταξινόμηση. Στο παράδειγμά μας, θα χρησιμοποιήσουμε τις επιλογές -r (αντίστροφη) και -n (αριθμητική ταξινόμηση) και θα διοχετεύσουμε τα αποτελέσματα σε λιγότερα.

Πληκτρολογούμε τα εξής:

uniq -c sorted.txt | sort -rn | less

ο

Η λίστα ταξινομείται με φθίνουσα σειρά με βάση τη συχνότητα εμφάνισης κάθε γραμμής.

Καταχώριση Μόνο διπλότυπες γραμμές

Εάν θέλετε να βλέπετε μόνο τις γραμμές που επαναλαμβάνονται σε ένα αρχείο, μπορείτε να χρησιμοποιήσετε την επιλογή -d (repeated). Ανεξάρτητα από το πόσες φορές μια γραμμή αντιγράφεται σε ένα αρχείο, εμφανίζεται μόνο μία φορά.

  Πώς να παίξετε το Mad Max στο Linux

Για να χρησιμοποιήσουμε αυτήν την επιλογή, πληκτρολογούμε τα εξής:

uniq -d sorted.txt

ο

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

Έξοδος από το

Μπορούμε επίσης να συνδυάσουμε τις επιλογές -d (επαναλαμβανόμενες) και -c (count) και να διοχετεύσουμε την έξοδο μέσω ταξινόμησης. Αυτό μας δίνει μια ταξινομημένη λίστα με τις γραμμές που εμφανίζονται τουλάχιστον δύο φορές.

Πληκτρολογήστε τα ακόλουθα για να χρησιμοποιήσετε αυτήν την επιλογή:

uniq -d -c sorted.txt | sort -rn

ο

Καταχώριση όλων των διπλότυπων γραμμών

Εάν θέλετε να δείτε μια λίστα με κάθε διπλότυπη γραμμή, καθώς και μια καταχώρηση για κάθε φορά που εμφανίζεται μια γραμμή στο αρχείο, μπορείτε να χρησιμοποιήσετε την επιλογή -D (όλες οι διπλότυπες γραμμές).

Για να χρησιμοποιήσετε αυτήν την επιλογή, πληκτρολογήστε τα εξής:

uniq -D sorted.txt | less

ο

Η καταχώριση περιέχει μια καταχώρηση για κάθε διπλότυπη γραμμή.

Εάν χρησιμοποιείτε την επιλογή –ομάδα, εκτυπώνει κάθε διπλότυπη γραμμή με μια κενή γραμμή είτε πριν (prepend) είτε μετά από κάθε ομάδα (append) είτε πριν και μετά (και τα δύο) από κάθε ομάδα.

Χρησιμοποιούμε το append ως τροποποιητή μας, επομένως πληκτρολογούμε τα εξής:

uniq --group=append sorted.txt | less

ο

Οι ομάδες χωρίζονται με κενές γραμμές για να είναι πιο ευανάγνωστες.

Έξοδος από το

Έλεγχος συγκεκριμένου αριθμού χαρακτήρων

Από προεπιλογή, το uniq ελέγχει όλο το μήκος κάθε γραμμής. Ωστόσο, εάν θέλετε να περιορίσετε τους ελέγχους σε συγκεκριμένο αριθμό χαρακτήρων, μπορείτε να χρησιμοποιήσετε την επιλογή -w (check chars).

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

uniq -w 3 --group=append sorted.txt | less

ο

Τα αποτελέσματα και οι ομαδοποιήσεις που λαμβάνουμε είναι αρκετά διαφορετικά.

Έξοδος από το

Όλες οι γραμμές που ξεκινούν με “I b” ομαδοποιούνται επειδή αυτά τα τμήματα των γραμμών είναι πανομοιότυπα, επομένως θεωρούνται διπλότυπα.

Ομοίως, όλες οι γραμμές που ξεκινούν με “I’m” αντιμετωπίζονται ως διπλότυπες, ακόμα κι αν το υπόλοιπο κείμενο είναι διαφορετικό.

Αγνοώντας έναν ορισμένο αριθμό χαρακτήρων

Υπάρχουν ορισμένες περιπτώσεις στις οποίες μπορεί να είναι ωφέλιμο να παραλείψετε έναν ορισμένο αριθμό χαρακτήρων στην αρχή κάθε γραμμής, όπως όταν οι γραμμές σε ένα αρχείο είναι αριθμημένες. Ή, ας πούμε ότι χρειάζεστε το uniq για να περάσετε πάνω από μια χρονική σήμανση και να αρχίσετε να ελέγχετε τις γραμμές από τον έκτο χαρακτήρα αντί από τον πρώτο χαρακτήρα.

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

Παρακάτω είναι μια έκδοση του ταξινομημένου αρχείου μας με αριθμημένες γραμμές.

Εάν θέλουμε το uniq να ξεκινήσει τους ελέγχους σύγκρισης του με τον χαρακτήρα τρία, μπορούμε να χρησιμοποιήσουμε την επιλογή -s (παράλειψη χαρακτήρων) πληκτρολογώντας τα εξής:

uniq -s 3 -d -c numbered.txt

ο

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

Μπορείτε επίσης να παραλείψετε πεδία (μια σειρά χαρακτήρων και λίγο κενό διάστημα) αντί για χαρακτήρες. Θα χρησιμοποιήσουμε την επιλογή -f (πεδία) για να πούμε στο uniq ποια πεδία να αγνοήσουμε.

Πληκτρολογούμε τα εξής για να πούμε στο uniq να αγνοήσει το πρώτο πεδίο:

uniq -f 1 -d -c  numbered.txt

ο

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

Αγνοώντας την υπόθεση

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

Για παράδειγμα, ελέγξτε την έξοδο από την ακόλουθη εντολή:

uniq -d -c sorted.txt | sort -rn

ο

Οι γραμμές “Πιστεύω ότι θα ξεσκονίσω τη σκούπα μου” και “Πιστεύω ότι θα ξεσκονίσω τη σκούπα μου” δεν αντιμετωπίζονται ως διπλότυπες λόγω της διαφοράς μεταξύ των πεζών στο “Β” σε “πιστεύω”.

Αν συμπεριλάβουμε την επιλογή -i (παράβλεψη πεζών-κεφαλαίων), ωστόσο, αυτές οι γραμμές θα αντιμετωπίζονται ως διπλότυπες. Πληκτρολογούμε τα εξής:

uniq -d -c -i sorted.txt | sort -rn

ο

Οι γραμμές αντιμετωπίζονται πλέον ως διπλότυπες και ομαδοποιούνται.

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

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

Εναλλακτικά, μπορείτε πάντα να κάνετε αναζήτηση στο How-To Geek—πιθανότατα έχουμε ένα άρθρο για αυτό.