3.2 Μάθημα 1
Πιστοποιητικό: |
Linux Essentials |
---|---|
Έκδοση: |
1.6 |
Θέμα: |
3 Η Δύναμη της Γραμμής Εντολών |
Σκοπός: |
3.2 Αναζήτηση και Εξαγωγή Δεδομένων από Αρχεία |
Μάθημα: |
1 απο 2 |
Εισαγωγή
Σε αυτό το εργαστήριο θα επικεντρωθούμε στην ανακατεύθυνση ή τη μετάδοση πληροφοριών από τη μια πηγή στην άλλη με τη βοήθεια συγκεκριμένων εργαλείων. Η γραμμή εντολών Linux ανακατευθύνει τις πληροφορίες μέσω συγκεκριμένων τυπικών καναλιών. Η τυπική είσοδος (stdin ή κανάλι 0) της εντολής θεωρείται ότι είναι το πληκτρολόγιο και η τυπική έξοδος (stdout ή κανάλι 1) θεωρείται η οθόνη. Υπάρχει επίσης ένα άλλο κανάλι που προορίζεται να ανακατευθύνει την έξοδο σφάλματος (stderr ή κανάλι 2) μιας εντολής ή των μηνυμάτων σφάλματος ενός προγράμματος. Η είσοδος και/ή η έξοδος μπορούν να ανακατευθυνθούν.
Κατά την εκτέλεση μιας εντολής, μερικές φορές θέλουμε να μεταδώσουμε ορισμένες πληροφορίες στην εντολή ή να ανακατευθύνουμε την έξοδο σε ένα συγκεκριμένο αρχείο. Κάθε μία από αυτές τις λειτουργίες θα συζητηθεί στις επόμενες δύο ενότητες.
Ανακατεύθυνση I/O
Η ανακατεύθυνση εισόδου/εξόδου [I/O] επιτρέπει στο χρήστη να ανακατευθύνει πληροφορίες από ή προς μια εντολή χρησιμοποιώντας ένα αρχείο κειμένου. Όπως περιγράφηκε προηγουμένως, η τυπική είσοδος, έξοδος και έξοδος σφάλματος μπορούν να ανακατευθυνθούν και οι πληροφορίες μπορούν να ληφθούν από αρχεία κειμένου.
Ανακατεύθυνση Tυπικής Eξόδου
Για να ανακατευθύνουμε την τυπική έξοδο σε ένα αρχείο, αντί για την οθόνη, πρέπει να χρησιμοποιήσουμε τον τελεστή >
ακολουθούμενο από το όνομα του αρχείου. Εάν το αρχείο δεν υπάρχει, θα δημιουργηθεί ένα νέο, διαφορετικά, οι πληροφορίες θα αντικαταστήσουν το υπάρχον αρχείο.
Για να δούμε τα περιεχόμενα του αρχείου που μόλις δημιουργήσαμε, μπορούμε να χρησιμοποιήσουμε την εντολή cat
. Από προεπιλογή, αυτή η εντολή εμφανίζει τα περιεχόμενα ενός αρχείου στην οθόνη. Συμβουλευτείτε τη σελίδα του εγχειριδίου για να μάθετε περισσότερα σχετικά με τις λειτουργίες της.
Το παρακάτω παράδειγμα δείχνει τη λειτουργικότητα του τελεστή. Στην πρώτη περίπτωση, δημιουργείται ένα νέο αρχείο που περιέχει το κείμενο "`Hello World!":
$ echo "Hello World!" > text $ cat text Hello World!
Στη δεύτερη περίπτωση, το ίδιο αρχείο αντικαθίσταται με το νέο κείμενο:
$ echo "Hello!" > text $ cat text Hello!
Αν θέλουμε να προσθέσουμε νέες πληροφορίες στο τέλος του αρχείου, πρέπει να χρησιμοποιήσουμε τον τελεστή >>
. Αυτός ο τελεστής δημιουργεί επίσης ένα νέο αρχείο εάν δεν μπορεί να βρει ένα υπάρχον.
Το πρώτο παράδειγμα δείχνει την προσθήκη του κειμένου. Όπως φαίνεται, το νέο κείμενο προστέθηκε στην ακόλουθη γραμμή:
$ echo "Hello to you too!" >> text $ cat text Hello! Hello to you too!
Το δεύτερο παράδειγμα δείχνει ότι θα δημιουργηθεί ένα νέο αρχείο:
$ echo "Hello to you too!" >> text2 $ cat text2 Hello to you too!
Ανακατεύθυνση Tυπικού Σφάλματος
Για να ανακατευθύνει μόνο τα μηνύματα σφάλματος, ένας χρήστης θα πρέπει να χρησιμοποιήσει τον τελεστή 2>
ακολουθούμενο από το όνομα του αρχείου στο οποίο θα εγγραφούν τα σφάλματα. Εάν το αρχείο δεν υπάρχει, θα δημιουργηθεί ένα νέο, διαφορετικά το αρχείο θα αντικατασταθεί.
Όπως εξηγήθηκε, το κανάλι για την ανακατεύθυνση του τυπικού σφάλματος είναι το κανάλι 2. Κατά την ανακατεύθυνση του τυπικού σφάλματος, το κανάλι πρέπει να καθοριστεί, σε αντίθεση με την άλλη τυπική έξοδο όπου το channel 1 έχει οριστεί από προεπιλογή. Για παράδειγμα, η ακόλουθη εντολή αναζητά ένα αρχείο ή κατάλογο με το όνομα games
και εγγράφει μόνο το σφάλμα στο αρχείο text-error
, ενώ εμφανίζει την τυπική έξοδο στην οθόνη:
$ find /usr games 2> text-error /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games $ cat text-error find: `games': No such file or directory
Note
|
Για περισσότερες πληροφορίες σχετικά με την εντολή |
Για παράδειγμα, η ακόλουθη εντολή θα εκτελεστεί χωρίς σφάλματα, επομένως δεν θα γραφτούν πληροφορίες στο αρχείο text-error
:
$ sort /etc/passwd 2> text-error $ cat text-error
Εκτός από την τυπική έξοδο, το τυπικό σφάλμα μπορεί επίσης να προσαρτηθεί σε ένα αρχείο με τον τελεστή 2>>
. Αυτό θα προσθέσει το νέο σφάλμα στο τέλος του αρχείου. Εάν το αρχείο δεν υπάρχει, θα δημιουργηθεί ένα νέο. Το πρώτο παράδειγμα δείχνει την προσθήκη των νέων πληροφοριών στο αρχείο, ενώ το δεύτερο παράδειγμα δείχνει ότι η εντολή δημιουργεί ένα νέο αρχείο όπου δεν μπορεί να βρεθεί ένα υπάρχον με το ίδιο όνομα:
$ sort /etc 2>> text-error $ cat text-error sort: read failed: /etc: Is a directory
$ sort /etc/shadow 2>> text-error2 $ cat text-error2 sort: open failed: /etc/shadow: Permission denied
Χρησιμοποιώντας αυτόν τον τύπο ανακατεύθυνσης, μόνο τα μηνύματα σφάλματος θα ανακατευθυνθούν στο αρχείο, η κανονική έξοδος θα γραφτεί στην οθόνη ή θα περάσει από τυπική έξοδο ή stdout.
Υπάρχει ένα συγκεκριμένο αρχείο που τεχνικά είναι ένα bit bucket (ένα αρχείο που δέχεται είσοδο και δεν κάνει τίποτα μαζί του): /dev/null
. Μπορείτε να ανακατευθύνετε τυχόν άσχετες πληροφορίες που μπορεί να μην θέλετε να εμφανίζονται ή να ανακατευθύνονται σε ένα σημαντικό αρχείο, όπως φαίνεται στο παρακάτω παράδειγμα:
$ sort /etc 2> /dev/null
Ανακατεύθυνση Tυπικής Εισόδου
Αυτός ο τύπος ανακατεύθυνσης χρησιμοποιείται για την εισαγωγή δεδομένων σε μια εντολή, από ένα καθορισμένο αρχείο αντί για ένα πληκτρολόγιο. Σε αυτήν την περίπτωση ο τελεστής <
χρησιμοποιείται όπως φαίνεται στο παράδειγμα:
$ cat < text Hello! Hello to you too!
Η ανακατεύθυνση τυπικής εισόδου χρησιμοποιείται συνήθως με εντολές που δεν δέχονται ορίσματα αρχείου. Η εντολή tr
είναι μία από αυτές. Αυτή η εντολή μπορεί να χρησιμοποιηθεί για τη μετάφραση των περιεχομένων του αρχείου τροποποιώντας τους χαρακτήρες σε ένα αρχείο με συγκεκριμένους τρόπους, όπως η διαγραφή οποιουδήποτε συγκεκριμένου χαρακτήρα από ένα αρχείο· το παρακάτω παράδειγμα δείχνει τη διαγραφή του χαρακτήρα l
:
$ tr -d "l" < text Heo! Heo to you too!
Για περισσότερες πληροφορίες, συμβουλευτείτε τη σελίδα man του tr
.
Here Documents
Σε αντίθεση με τις ανακατευθύνσεις εξόδου, ο τελεστής <<
ενεργεί με διαφορετικό τρόπο σε σύγκριση με τους άλλους τελεστές. Αυτή η ροή εισόδου ονομάζεται επίσης here document. Το here document αντιπροσωπεύει το τμήμα κώδικα ή κειμένου που μπορεί να ανακατευθυνθεί στην εντολή ή στο διαδραστικό πρόγραμμα. Διαφορετικοί τύποι σεναριακών γλωσσών, όπως bash
, sh
και csh
μπορούν να λάβουν είσοδο απευθείας από τη γραμμή εντολών, χωρίς τη χρήση αρχείων κειμένου.
Όπως φαίνεται στο παρακάτω παράδειγμα, ο τελεστής χρησιμοποιείται για την εισαγωγή δεδομένων στην εντολή, ενώ η επομένη λέξη δεν καθορίζει το όνομα του αρχείου. Η λέξη ερμηνεύεται ως οριοθέτης της εισόδου και δεν θα ληφθεί υπόψη ως περιεχόμενο, επομένως η εντολή cat
δεν θα την εμφανίσει:
$ cat << hello > hey > ola > hello hey ola
Συμβουλευτείτε τη σελίδα man της εντολής cat
για να βρείτε περισσότερες πληροφορίες.
Συνδυασμοί
Ο πρώτος συνδυασμός που θα εξερευνήσουμε συνδυάζει την ανακατεύθυνση της τυπικής εξόδου και της εξόδου τυπικού σφάλματος στο ίδιο αρχείο. Οι τελεστές &>
και &>>
χρησιμοποιούνται, το &
αντιπροσωπεύει τον συνδυασμό του καναλιού 1 και καναλιού 2. Ο πρώτος τελεστής θα αντικαταστήσει τα υπάρχοντα περιεχόμενα του αρχείου και ο δεύτερος θα προσαρτήσει ή θα προσθέσει τις νέες πληροφορίες στο τέλος του αρχείου. Και οι δύο τελεστές θα ενεργοποιήσουν τη δημιουργία του νέου αρχείου εάν δεν υπάρχει, όπως ακριβώς στις προηγούμενες ενότητες:
$ find /usr admin &> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory $ find /etc/calendar &>> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory /etc/calendar /etc/calendar/default
Ας ρίξουμε μια ματιά σε ένα παράδειγμα χρησιμοποιώντας την εντολή cut
:
$ cut -f 3 -d "/" newfile $ cat newfile share share share ---------Omitted output---------- lib games find: `admin': No such file or directory calendar calendar find: `admin': No such file or directory
Η εντολή cut
κόβει καθορισμένα πεδία από το αρχείο εισόδου χρησιμοποιώντας την επιλογή -f
, το 3ο πεδίο στην περίπτωσή μας. Προκειμένου η εντολή να βρει το πεδίο, πρέπει να καθοριστεί και ένας οριοθέτης με την επιλογή -d
. Στην περίπτωσή μας ο οριοθέτης θα είναι ο χαρακτήρας /
.
Για να μάθετε περισσότερα σχετικά με την εντολή cut
, συμβουλευτείτε τη σελίδα man της.
Pipes Γραμμής Εντολών
Η ανακατεύθυνση χρησιμοποιείται κυρίως για την αποθήκευση του αποτελέσματος μιας εντολής, για επεξεργασία από διαφορετική εντολή. Αυτός ο τύπος ενδιάμεσης επεξεργασίας μπορεί να γίνει πολύ κουραστικός και περίπλοκος εάν θέλετε τα δεδομένα να περάσουν από πολλαπλά processes. Για να το αποφύγετε αυτό, μπορείτε να συνδέσετε την εντολή απευθείας μέσω pipes. Με άλλα λόγια, η έξοδος της πρώτης εντολής γίνεται αυτόματα η είσοδος της δεύτερης εντολής. Αυτή η σύνδεση γίνεται χρησιμοποιώντας τον τελεστή |
(κάθετη γραμμή):
$ cat /etc/passwd | less root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh :
Στο παραπάνω παράδειγμα, η εντολή less
μετά τον τελεστή pipe τροποποιεί τον τρόπο με τον οποίο εμφανίζεται το αρχείο. Η εντολή less
εμφανίζει το αρχείο κειμένου επιτρέποντας στον χρήστη να κάνει κύλιση προς τα πάνω και προς τα κάτω σε μια γραμμή εκείνη τη στιγμή. Η less
χρησιμοποιείται επίσης από προεπιλογή για την εμφάνιση των σελίδων εγχειριδίου man, όπως συζητήθηκε στα προηγούμενα μαθήματα.
Είναι δυνατή η ταυτόχρονη χρήση πολλών pipes. Οι ενδιάμεσες εντολές που λαμβάνουν είσοδο στη συνέχεια την αλλάζουν και παράγουν έξοδο ονομάζονται φίλτρα. Ας πάρουμε την εντολή ls -l
και ας προσπαθήσουμε να μετρήσουμε τον αριθμό των λέξεων από τις πρώτες 10 γραμμές της εξόδου. Για να γίνει αυτό, θα πρέπει να χρησιμοποιήσουμε την εντολή head
που από προεπιλογή εμφανίζει τις πρώτες 10 γραμμές ενός αρχείου και στη συνέχεια να μετρήσουμε τις λέξεις χρησιμοποιώντας την εντολή wc
:
$ ls -l | head | wc -w 10
Όπως αναφέρθηκε προηγουμένως, από προεπιλογή, το head
εμφανίζει μόνο τις πρώτες 10 γραμμές του καθορισμένου αρχείου κειμένου. Αυτή η συμπεριφορά μπορεί να τροποποιηθεί χρησιμοποιώντας συγκεκριμένες επιλογές. Ελέγξτε τη σελίδα man της εντολής για να βρείτε περισσότερα.
Υπάρχει μια άλλη εντολή που εμφανίζει το τέλος ενός αρχείου: tail
. Από προεπιλογή, αυτή η εντολή επιλέγει τις τελευταίες 10 γραμμές και τις εμφανίζει, αλλά όπως με το head
ο αριθμός μπορεί επίσης να τροποποιηθεί. Ελέγξτε τη σελίδα man της tail
για περισσότερες λεπτομέρειες.
Note
|
Η επιλογή |
Η εντολή wc
(πλήθος λέξεων) μετράει από προεπιλογή τις γραμμές, τις λέξεις και τα byte ενός αρχείου. Όπως φαίνεται στην άσκηση, η επιλογή -w
κάνει την εντολή να μετράει μόνο τις λέξεις μέσα στις επιλεγμένες γραμμές. Οι πιο συνηθισμένες επιλογές που μπορείτε να χρησιμοποιήσετε με αυτήν την εντολή είναι: -l
, που καθορίζει στην εντολή να μετράει μόνο τις γραμμές και -c
, που χρησιμοποιείται για τη μέτρηση μόνο των byte. Περισσότερες παραλλαγές και επιλογές της εντολής, καθώς και περισσότερες πληροφορίες για το wc
μπορείτε να βρείτε στη σελίδα man της εντολής.
Καθοδηγούμενες Ασκήσεις
-
Παραθέστε τα περιεχόμενα του τρέχοντος καταλόγου σας, συμπεριλαμβανομένης της ιδιοκτησίας και των δικαιωμάτων, και ανακατευθύνετε την έξοδο σε ένα αρχείο που ονομάζεται
contents.txt
στον κατάλογο αφετηρίας σας. -
Ταξινομήστε τα περιεχόμενα του αρχείου
contents.txt
από τον τρέχοντα κατάλογό σας και προσθέστε το στο τέλος ενός νέου αρχείου που ονομάζεταιcontents-sorted.txt
. -
Εμφανίστε τις τελευταίες 10 γραμμές του αρχείου
/etc/passwd
και ανακατευθύνετέ το σε ένα νέο αρχείο στον κατάλογοDocuments
του χρήστη σας. -
Μετρήστε τον αριθμό των λέξεων στο αρχείο
contents.txt
και προσθέστε την έξοδο στο τέλος ενός αρχείουfield2.txt
στον κατάλογο αφετηρίας σας. Θα χρειαστεί να χρησιμοποιήσετε την ανακατεύθυνση εισόδου και εξόδου μαζί. -
Εμφανίστε τις πρώτες 5 γραμμές του αρχείου
/etc/passwd
και ταξινομήστε την έξοδο αντίστροφα αλφαβητικά. -
Χρησιμοποιώντας το αρχείο
contents.txt
που δημιουργήθηκε προηγουμένως, μετρήστε τον αριθμό των χαρακτήρων των τελευταίων 9 γραμμών. -
Μετρήστε τον αριθμό των αρχείων που ονομάζονται
test
στον κατάλογο/usr/share
και στους υποκαταλόγους του. Σημείωση: κάθε γραμμή που βγαίνει από την εντολήfind
αντιπροσωπεύει ένα αρχείο.
Ασκήσεις Εξερεύνησης
-
Επιλέξτε το δεύτερο πεδίο του αρχείου
contents.txt
και ανακατευθύνετε την τυπική έξοδο και έξοδο σφάλματος σε ένα άλλο αρχείο που ονομάζεταιfield1.txt
. -
Χρησιμοποιώντας τον τελεστή ανακατεύθυνσης εισόδου και την εντολή
tr
, διαγράψτε τις παύλες (-
) από το αρχείοcontents.txt
. -
Ποιο είναι το μεγαλύτερο πλεονέκτημα της ανακατεύθυνσης μόνο σφαλμάτων σε ένα αρχείο;
-
Αντικαταστήστε όλα τα επαναλαμβανόμενα κενά διαστήματα στο αλφαβητικά ταξινομημένο αρχείο
contents.txt
με ένα μόνο διάστημα. -
Σε μία γραμμή εντολών, καταργήστε τα επαναλαμβανόμενα κενά (όπως έγινε στην προηγούμενη άσκηση), επιλέξτε το ένατο πεδίο και ταξινομήστε το αντίστροφα αλφαβητικά και χωρίς διάκριση πεζών-κεφαλαίων. Πόσα pipes έπρεπε να χρησιμοποιήσετε;
Σύνοψη
Σε αυτό το εργαστήριο μάθατε:
-
Τύπους ανακατεύθυνσης
-
Πώς να χρησιμοποιήσετε τους τελεστές ανακατεύθυνσης
-
Πώς να χρησιμοποιήσετε pipes για να φιλτράρετε την έξοδο εντολών
Εντολές που χρησιμοποιήθηκαν σε αυτό το μάθημα:
cut
-
Αφαιρεί τμήματα από κάθε γραμμή ενός αρχείου.
cat
-
Εμφανίζει ή συνενώνει αρχεία.
find
-
Αναζητά αρχεία σε μια ιεραρχία καταλόγου.
less
-
Εμφανίζει ένα αρχείο, επιτρέποντας στον χρήστη να κάνει κύλιση κατά μία γραμμή κάθε φορά.
more
-
Εμφανίζει ένα αρχείο, μια σελίδα κάθε φορά.
head
-
Εμφανίζει τις πρώτες 10 γραμμές ενός αρχείου.
tail
-
Εμφανίζει τις τελευταίες 10 γραμμές ενός αρχείου.
sort
-
Ταξινομεί αρχεία.
wc
-
Μετρά από προεπιλογή τις γραμμές, τις λέξεις ή τα byte ενός αρχείου.
Απαντήσεις στις Καθοδηγούμενες Ασκήσεις
-
Παραθέστε τα περιεχόμενα του τρέχοντος καταλόγου σας, συμπεριλαμβανομένης της ιδιοκτησίας και των δικαιωμάτων, και ανακατευθύνετε την έξοδο σε ένα αρχείο που ονομάζεται
contents.txt
στον κατάλογο αφετηρίας σας.$ ls -l > contents.txt
-
Ταξινομήστε τα περιεχόμενα του αρχείου
contents.txt
από τον τρέχοντα κατάλογό σας και προσθέστε το στο τέλος ενός νέου αρχείου που ονομάζεταιcontents-sorted.txt
.$ sort contents.txt >> contents-sorted.txt
-
Εμφανίστε τις τελευταίες 10 γραμμές του αρχείου
/etc/passwd
και ανακατευθύνετέ το σε ένα νέο αρχείο στον κατάλογοDocuments
του χρήστη σας.$ tail /etc/passwd > Documents/newfile
-
Μετρήστε τον αριθμό των λέξεων στο αρχείο
contents.txt
και προσθέστε την έξοδο στο τέλος ενός αρχείουfield2.txt
στον κατάλογο αφετηρίας σας. Θα χρειαστεί να χρησιμοποιήσετε την ανακατεύθυνση εισόδου και εξόδου μαζί.$ wc < contents.txt >> field2.txt
-
Εμφανίστε τις πρώτες 5 γραμμές του αρχείου
/etc/passwd
και ταξινομήστε την έξοδο αντίστροφα αλφαβητικά.$ head -n 5 /etc/passwd | sort -r
-
Χρησιμοποιώντας το αρχείο
contents.txt
που δημιουργήθηκε προηγουμένως, μετρήστε τον αριθμό των χαρακτήρων των τελευταίων 9 γραμμών.$ tail -n 9 contents.txt | wc -c 531
-
Μετρήστε τον αριθμό των αρχείων που ονομάζονται
test
στον κατάλογο/usr/share
και στους υποκαταλόγους του. Σημείωση: κάθε γραμμή που βγαίνει από την εντολήfind
αντιπροσωπεύει ένα αρχείο.$ find /usr/share -name test | wc -l 125
Απαντήσεις στις Ασκήσεις Εξερεύνησης
-
Επιλέξτε το δεύτερο πεδίο του αρχείου
contents.txt
και ανακατευθύνετε την τυπική έξοδο και έξοδο σφάλματος σε ένα άλλο αρχείο που ονομάζεταιfield1.txt
.$ cut -f 2 -d " " contents.txt &> field1.txt
-
Χρησιμοποιώντας τον τελεστή ανακατεύθυνσης εισόδου και την εντολή
tr
, διαγράψτε τις παύλες (-
) από το αρχείοcontents.txt
.$ tr -d "-" < contents.txt
-
Ποιο είναι το μεγαλύτερο πλεονέκτημα της ανακατεύθυνσης μόνο σφαλμάτων σε ένα αρχείο;
Η ανακατεύθυνση μόνο σφαλμάτων σε ένα αρχείο μπορεί να βοηθήσει στη διατήρηση ενός αρχείου log που παρακολουθείται συχνά.
-
Αντικαταστήστε όλα τα επαναλαμβανόμενα κενά διαστήματα στο αλφαβητικά ταξινομημένο αρχείο
contents.txt
με ένα μόνο διάστημα.$ sort contents.txt | tr -s " "
-
Σε μία γραμμή εντολών, καταργήστε τα επαναλαμβανόμενα κενά (όπως έγινε στην προηγούμενη άσκηση), επιλέξτε το ένατο πεδίο και ταξινομήστε το αντίστροφα αλφαβητικά και χωρίς διάκριση πεζών-κεφαλαίων. Πόσα pipes έπρεπε να χρησιμοποιήσετε;
$ cat contents.txt | tr -s " " | cut -f 9 -d " " | sort -fr
Η άσκηση χρησιμοποιεί 3 pipes, έναν για κάθε φίλτρο.