Τι είναι τα Metacharacters του Linux και πώς τα χρησιμοποιείτε

Σύμφωνα με τη Wikipedia, ένας metacharacter είναι οποιοσδήποτε χαρακτήρας που έχει ένα ειδικό νόημα, όπως ένα καράτι (^), ένα σύμβολο του δολαρίου ($) ή ένας αστερίσκος (*).

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

Η πλήρης διακοπή ως ένα Metacharacter (.)

Ο ταπεινός πλήρης σταθμός χρησιμοποιείται για να δωρίσει την τρέχουσα θέση όταν τρέχει εντολές όπως cd , find ή sh αλλά μέσα σε εφαρμογές όπως awk , grep και sed χρησιμοποιείται για να υποδηλώσει οποιοδήποτε χαρακτήρα.

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

εύρημα . -name * .mp3

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

Τώρα δείτε αυτή την εντολή:

ps -ef | grep f..efox

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

Επομένως, η εντολή ps -ef παίρνει μια λίστα με τρέχουσες διεργασίες και την δίνει στο grep που ψάχνει για οποιαδήποτε γραμμή στη λίστα που έχει f..efox όπου το. μπορεί να σημαίνει οποιοδήποτε χαρακτήρα.

Εάν έχετε τρέξει firefox θα πάρετε έναν αγώνα. Ομοίως, αν έχετε ένα πρόγραμμα που ονομάζεται fonefox ή freefox τρέξιμο, θα επιστραφούν επίσης.

Ο αστερίσκος ως metacharacter (*)

Ο αστερίσκος είναι ένας παγκοσμίως γνωστός metacharacter και χρησιμοποιείται για να σημαίνει 0 ή περισσότερα όταν ψάχνετε για ένα μοτίβο.

Για παράδειγμα:

εύρημα . -name * .mp3

Το * .mp3 επιστρέφει μια αντιστοιχία για οποιοδήποτε όνομα αρχείου που τελειώνει σε .mp3. Ομοίως, θα μπορούσα να χρησιμοποιήσω τον αστερίσκο με την εντολή grep όπως φαίνεται παρακάτω:

ps -ef | grep F * efox

Αξίζει να σημειωθεί ότι αυτό διαφέρει ελαφρώς επειδή ο αστερίσκος σημαίνει μηδέν ή και περισσότερο, καθώς επίσης και εύρεση firefox, facefox και fonefox μπορεί επίσης να βρει flutefox, ferretfox και ακόμα και μόνο fefox.

Το καράτι ως ένα Metacharacter (^)

Το καράτι (^) χρησιμοποιείται για να δηλώσει την αρχή μιας γραμμής ή μιας συμβολοσειράς. Έτσι πώς χρησιμοποιείται;

Η εντολή ls χρησιμοποιείται για να απαριθμήσει όλα τα αρχεία σε ένα φάκελο ως εξής:

ls

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

Για παράδειγμα:

ls | grep ^ gnome

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

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

Το σύμβολο του δολαρίου ως Metacharacter ($)

Το σύμβολο του δολαρίου μπορεί να έχει πολλαπλές έννοιες ως metacharacter μέσα στο Linux.

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

Για παράδειγμα:

ls | grep png $

Αυτό περιγράφει όλα τα αρχεία που τελειώνουν με png.

Το σύμβολο του δολαρίου χρησιμοποιείται επίσης για πρόσβαση σε μεταβλητές περιβάλλοντος μέσα στο κέλυφος bash.

Για παράδειγμα:

σκύλος εξαγωγής = molly
echo $ dog

Ο σκύλος εξαγωγής γραμμών = molly δημιουργεί μια μεταβλητή περιβάλλοντος που ονομάζεται σκύλος και ορίζει την τιμή του σε molly. Για να μεταβείτε στη μεταβλητή περιβάλλοντος, χρησιμοποιείται το σύμβολο $. Με το σύμβολο $ η δήλωση του σκύλου echo $ εμφανίζεται molly αλλά χωρίς αυτό, η δήλωση του σκύλου echo εμφανίζει μόνο τη λέξη dog.

Εξαφανισμένοι μεταχαρακτήρες

Μερικές φορές δεν θέλετε ο μεταχαρακτήρας να έχει ιδιαίτερο νόημα. Τι γίνεται αν έχετε ένα αρχείο που ονομάζεται f.refox και ένα αρχείο που ονομάζεται firefox.

Τώρα κοιτάξτε την ακόλουθη εντολή:

ls | grep f.refox

Τι πιστεύεις ότι έχει επιστραφεί; Τόσο η f.refox όσο και η firefox επιστρέφονται επειδή και οι δύο ταιριάζουν με το μοτίβο.

Για να επιστρέψετε μόνο το f.refox θα χρειαστεί να ξεφύγετε από το πλήρες σταθμό για να σημάνετε πραγματικά μια πλήρη στάση ως εξής:

ls | grep f \\. refox

Κοινά metacharacters και οι σημασίες τους

Κατάλογος των Metacharacters του Linux
Χαρακτήρας Εννοια
. Οποιοσδήποτε χαρακτήρας
* Μηδενικοί ή περισσότεροι χαρακτήρες
^ Ταίριασμα κάθε γραμμής ή συμβολοσειράς που αρχίζει με ένα πρότυπο (π.χ. ^ gnome)
$ Ταιριάξτε κάθε γραμμή ή συμβολοσειρά που τελειώνει με ένα μοτίβο (π.χ. gnome $)
\ Αποφεύγει τον επόμενο χαρακτήρα για να αφαιρέσει την ιδιαίτερη σημασία του
[] Ταίριασμα ενός από μια λίστα ή εύρος (δηλαδή ["abc", "def"] ή [1..9]
+ Ταίριασμα ενός ή περισσότερων προηγούμενων (π.χ. grep a +)
; Ταίριασμα μηδέν ή προηγούμενο