Professional Documents
Culture Documents
Εργαστήριο 4
Εργαστήριο 4
Διδάσκων: I. Μουμτζίδης
3ο Εργαστήριο.
Θεωρία
stdin
Standard input είναι δεδομένα (συχνά σε μορφή κειμένου) που δίνονται ως είσοδος σε ένα
πρόγραμμα. Το πρόγραμμα ζητάει τη μεταφορά των δεδομένων (από την είσοδο προς αυτό) με τη
χρήση της λειτουργίας read (ανάγνωση).
Να σημειωθεί πως δεν χρειάζονται όλα τα προγράμματα κάποια είσοδο. Για παράδειγμα η εντολή ls (η
κάθε εντολή είναι ένα πρόγραμμα) εκτελεί τη λειτουργία της χωρίς να δέχεται κανένα δεδομένο από
την είσοδο.
Εκτός κι αν ζητηθεί κάποια ανακατεύθυνση, η είσοδος των δεδομένων αναμένεται από το
πληκτρολόγιο το οποίο ξεκίνησε το πρόγραμμα.
Το file descriptor (αριθμός - ταυτότητα που αντιστοιχεί σε κάθε ανοικτό αρχείο) για το πρότυπο αρχείο
εισόδου είναι το 0 (μηδέν), στη C αντιστοιχεί στη μεταβλητή FILE* stdin της βιβλιοθήκης <stdio.h>
ενώ στη C++ αντιστοιχεί στο μεταβλητή std::cin της βιβλιοθήκης <iostream>
stdout
Standard output είναι ένα αρχείο – ροή (stream) όπου το πρόγραμμα γράφει τα δεδομένα εξόδου. Το
πρόγραμμα ζητάει τη μεταφορά των δεδομένων (από αυτό προς την έξοδο) με τη χρήση της
λειτουργίας write (εγγραφή).
Να σημειωθεί πως δεν παράγουν δεδομένα εξόδου όλα τα προγράμματα. Για παράδειγμα η εντολή mv
που μετονομάζει ή/και μετακινεί αρχεία δεν παράγει κανένα μήνυμα όταν εκτελείται επιτυχημένα.
Εκτός κι αν ζητηθεί κάποια ανακατεύθυνση, η πρότυπη έξοδος των δεδομένων είναι το τερματικό
κειμένου (κοινώς η οθόνη) το οποίο αρχικοποίησε το πρόγραμμα.
Το file descriptor για το πρότυπο αρχείο εξόδου είναι το 1 (ένα), στη C αντιστοιχεί στη μεταβλητή
FILE* stdout της βιβλιοθήκης <stdio.h> ενώ στη C++ αντιστοιχεί στο μεταβλητή std::cout της
βιβλιοθήκης <iostream>.
stderr
Standard error είναι ένα ακόμα αρχείο – ροή (stream) εξόδου που χρησιμοποιείται από τα
προγράμματα για να εξάγουν μηνύματα λάθους ή διαγνωστικά μηνύματα. Είναι ένα αρχείο – ροή
ανεξάρτητο από το standard output και μπορεί να ανακατευθυνθεί ανεξάρτητα από αυτό.
Εκτός κι αν ζητηθεί κάποια ανακατεύθυνση, η πρότυπη έξοδος των μηνυμάτων λάθους είναι συνήθως
το τερματικό κειμένου (κοινώς η οθόνη) το οποίο αρχικοποίησε το πρόγραμμα.
Το file descriptor για το πρότυπο αρχείο εξόδου είναι το 2 (δύο), στη C αντιστοιχεί στη μεταβλητή
FILE* stderr της βιβλιοθήκης <stdio.h> ενώ στη C++ αντιστοιχεί στις μεταβλητές std::cerr και
std::clog της βιβλιοθήκης <iostream>.
Τελεστές ανακατεύθυνσης
Τελεστές ανακατεύθυνσης ονομάζονται οι τελεστές που υποχρεώνουν την εφαρμογή στην οποία
εφαρμόζονται να εκτρέψει τα μηνύματά της από τα προκαθορισμένα αρχεία εισόδου/εξόδου σε τρίτα
αρχεία.
ls -l > DirListing
Εκτροπή των μηνυμάτων της εντολής ls -l από το stdout στο αρχείο DirListing. Αν το αρχείο DirListing
υπάρχει τότε διαγράφονται όλα τα περιεχόμενά του και μετά αποθηκεύονται σε αυτό όλα τα μηνύματα
προς το stdout της εντολής ls -l. Αν το αρχείο DirListing δεν υπάρχει τότε δημιουργείται. Στο τέλος
της εκτέλεσης της εντολής το αρχείο DirListing, που υπάρχει (ή δημιουργείται) στον ίδιο κατάλογο
στον οποίο εκτελείται η εντολή, περιέχει σε μορφή κειμένου όλα τα μηνύματα που θα εμφάνιζε στην
οθόνη του συστήματος η εκτέλεση της εντολής ls -l.
Για την εκτροπή των μηνυμάτων λάθους στο ίδιο αρχείο στο οποίο γίνεται η εκτροπή των μηνυμάτων
του stdout θα πρέπει στο τέλος της εντολής να συμπληρωθεί 2>&1
Παράδειγμα:
ls -l ~bob/Documents > BobDocumentsListing 2>&1
Τα μηνύματα με προορισμό το stdout της εντολής ls -l ~bob/Documents, που δείχνει τα περιεχόμενα
του φακέλου Documents κάτω από τον αρχικό φάκελο του χρήστη bob ανακατευθύνονται (κι άρα
αποθηκεύονται) στο αρχείο BobDocumentsListing. Στο ίδιο αρχείο θα αποθηκευθούν κι όλα τα
μηνύματα λάθους που θα πιθανώς θα παράγει η εκτέλεση της εντολής (πχ ότι ο χρήστης δεν έχει τα
κατάλληλα δικαιώματα να δει τα περιεχόμενα του φακέλου αυτού).
Παράδειγμα:
Ο τελεστής ανακατεύθυνσης |
Ο τελεστής | χρησιμοποιείται για την εκτροπή των μηνυμάτων μίας εντολής από το stdout στo stdin
της εντολής που ακολουθεί. Κοινώς τα αποτελέσματα της εντολής στα αριστερά του τελεστή
χρησιμοποιούνται σαν το τελευταίο όρισμα της εντολής στα δεξιά του τελεστή
Παράδειγμα:
xargs
Η εντολή xargs είναι μία αρκετά σύνθετη εντολή. Παίρνει ως είσοδο τα μηνύματα του αρχείου stdin,
τα χωρίζει σε τμήματα κάθε φορά που συναντά τον χαρακτήρα ' ' (κενό) ή τον χαρακτήρα cr (νέα
γραμμή) και για κάθε τμήμα εκτελεί την εντολή που παίρνει ως παράμετρο βάζοντας σε αυτήν το
τμήμα ως παράμετρο.
Παράδειγμα:
ls *ToDelete* | xargs rm -r
H xargs διαβάζει τα μηνύματα του stdin. Στο stdin έχουν αποθηκευθεί (λόγω του τελεστή
ανακατεύθυνσης | που προηγείται) τα μηνύματα προς το stdout της εντολής ls *ToDelete*, δηλαδή τα
ονόματα των αρχείων του τρέχων καταλόγου που στο όνομά τους περιέχουν το string ToDelete. H
xargs θα πάρει τη λίστα αυτή, θα την χωρίσει σε τμήματα με βάση τον χαρακτήρα κενό. Επομένως
κάθε τμήμα είναι ένα όνομα αρχείου (αυτό ισχύει μόνο στην περίπτωση που κανένα από τα αρχεία του
φακέλου δεν περιέχει κενό στο όνομά του). Για κάθε τμήμα εκτελεί την εντολή rm -r τμήμα_X, κι
αφού κάθε τμήμα είναι ένα όνομα αρχείου, τότε η εντολή αυτή θα σβήσει όλα τα αρχεία που το όνομά
του περιέχει το string ToDelete και είναι κάτω από τον τρέχων κατάλογο.
echo
Γράφει το μήνυμα που παίρνει ως όρισμα στο πρότυπο αρχείο εξόδου (stdout)
Παράδειγμα:
cat
Στο Unix/Linux υπάρχουν πολλές εντολές με τις οποίες μπορούμε να δούμε τα περιεχόμενα ενός ή
περισσότερων αρχείων. Η εντολή cat εμφανίζει τα περιεχόμενα των αρχείων σειριακά, χωρίς κανένα
διαχωρισμό μεταξύ τους.
cat [options] filenames
Παράδειγμα:
more
H εντολή more εμφανίζει τα περιεχόμενα των αρχείων σειριακά, με διαχωρισμό μεταξύ τους και με
σελιδοποίηση (αν το περιεχόμενο των αρχείων ξεπερνάει σε μέγεθος το παράθυρο του τερματικού,
τότε γεμίζει μία οθόνη και σταματάει περιμένοντας από τον χρήστη να προχωρήσει μπροστά.
Μπορούμε να προχωρήσουμε μπροστά μόνο είτε με space (προχωράει μπροστά τόσες γραμμές όσες το
μέγεθος της οθόνης) είτε με cr (enter) (προχωράει μπροστά μία γραμμή) είτε με άλλες επιλογές (δείτε
man more για περισσότερες πληροφορίες).
more [options] filenames
Παράδειγμα:
less
Η εντολή less εμφανίζει τα περιεχόμενα των αρχείων σειριακά, με διαχωρισμό μεταξύ τους και με
σελιδοποίηση. Για να εμφανίσουμε το περιεχόμενο του επόμενου αρχείου χρησιμοποιούμε τον
συνδυασμό :n ενώ για το περιεχόμενο του προηγούμενου αρχείου τον συνδυασμό :p. Μπορούμε να
προχωρήσουμε μπροστά και πίσω με επιλογές όπως space ή f (προχωράει μπροστά τόσες γραμμές
όσες το μέγεθος της οθόνης) και b (μετακινείται πίσω τόσες γραμμές όσες το μέγεθος της οθόνης).
Δείτε man more για περισσότερες πληροφορίες.
less [options] filenames
Παράδειγμα:
head
Η εντολή head χρησιμοποιείται για να εμφανίσει τις πρώτες γραμμές ενός αρχείου. Η head εμφανίζει
10 πρώτες γραμμές, εκτός αν γίνει χρήση του διακόπτη n. Αν ο αριθμός που ακολουθεί τον διακόπτη
n είναι θετικός τότε εμφανίζει τόσες γραμμές του αρχείου όσες κι ο αριθμός. Αν όμως ο αριθμός είναι
αρνητικός τότε εμφανίζει όλες τις γραμμές του αρχείου εκτός από αυτόν τον αριθμό των τελευταίων
γραμμών του.
head [options] filename
Παράδειγμα 1:
head –n 30 /etc/passwd
Εμφάνιση των 30 πρώτων γραμμών του αρχείου passwd.
Παράδειγμα 2:
head –n -3 /etc/group
Εμφάνιση όλων γραμμών του αρχείου group εκτός από τις 3 τελευταίες
tail
Η εντολή tail χρησιμοποιείτε για να εμφανίσει τις τελευταίες γραμμές ενός αρχείου. Η tail εμφανίζει 10
τελευταίες γραμμές, εκτός αν χρησιμοποιήσετε τον διακόπτη n. Η εντολή tail συχνά χρησιμοποιείται
για να βλέπουμε τις τελευταίες εγγραφές ενός αρχείου καταγραφής (log file). Για να βλέπουμε
συνεχώς τις τελευταίες εγγραφές ενός αρχείου, χρησιμοποιούμε τον διακόπτη f.
tail [options] filename
Παράδειγμα 1:
tail –n 5 /etc/passwd
Eμφάνιση των τελευταίων 5 γραμμών του αρχείου passwd.
Παράδειγμα 2:
tail –n +4 /etc/passwd
Εμφάνιση όλων των γραμμών του αρχείου passwd από την τέταρτη γραμμή και μετά.
Παράδειγμα 3:
tail –f /var/log/messages.
Συνεχής εμφάνιση των τελευταίων εγγραφών στο αρχείο messages.
find
Η εντολή find χρησιμοποιείται για την ανεύρεση αρχείων και καταλόγων που ταιριάζουν με το
επιθυμητό όνομα αρχείου ή άλλα κριτήρια. Η απλούστερη δυνατή σύνταξη της εντολής find θα δώσει
μία λίστα των αρχείων που υπάρχουν σε ένα κατάλογο και στους υποκαταλόγους του.
find [path...] [expression]
path: Λίστα από φακέλους χωρισμένους με κενό μεταξύ τους μέσα στους οποίους γίνεται η αναζήτηση.
expression: Παραστάσεις από options (επιλογές), tests και actions (ενέργειες) που συνδέονται μεταξύ τους με
τελεστές. Αν δεν υπάρχει κάποιος τελεστής τότε εννοείται ο τελεστής –and.
-iname pattern
Βρίσκει αρχεία και φακέλους που το όνομά τους ακολουθεί το pattern. Η αναζήτηση αγνοεί το case (case insensitive).
-amin [+n|-n|n]
Βρίσκει αρχεία στα οποία έγινε πρόσβαση πριν από περισσότερα από n λεπτά (λιγότερα από n λεπτά/ακριβώς πριν από
n λεπτά).
-atime [+n|-n|n]
Βρίσκει αρχεία στα οποία έγινε πρόσβαση πριν από περισσότερες από n ημέρες (λιγότερες από n ημέρες/ακριβώς πριν
από n ημέρες).
-mmin [+n|-n|n]
Βρίσκει αρχεία που τροποποιήθηκαν πριν από περισσότερα από n λεπτά (λιγότερα από n λεπτά/ακριβώς πριν από n
λεπτά).
-mtime [+n|-n|n]
Βρίσκει αρχεία που τροποποιήθηκαν πριν από περισσότερες από n ημέρες (λιγότερες από n ημέρες/ακριβώς πριν από n
ημέρες).
Βρίσκει αρχεία που ανήκουν στο χρήστη user ή στο χρήστη με το συγκεκριμένο user ID.
Βρίσκει αρχεία που ανήκουν στην ομάδα με το όνομα gname ή με το συγκεκριμένο group ID.
-type filetype
Αναζητά αρχεία του συγκεκριμένου τύπου. To filetype μπορεί να πάρει τις παρακάτω τιμές:
d directory
f regular file
l symbolic link
s socket
Αναζητά αρχεία μεγέθους μεγαλύτερου (μικρότερου ή ίσου) με το μέγεθος που καθορίζει ο χρήστης. Το spaceunit
μπορεί να πάρει μία από της παρακάτω τιμές:
c για bytes
k για Kilobytes
M για Megabytes
G για Gigabytes
Αναλυτικότερες πληροφοριές για τους διακόπτες και τις χρήσεις της εντολής find στο manual της εντολής (man find).
Παράδειγμα 1:
Παράδειγμα 2:
Παράδειγμα 3:
Παράδειγμα 4:
Παράδειγμα 5:
grep
Aναζήτηση συγκεκριμένου pattern μέσα σε αρχεία κειμένου. Η προκαθορισμένη συμπεριφορά της
εντολής grep είναι να τυπώνει τις γραμμές του αρχείου που περιέχουν το pattern.
grep [options] [pattern] filename
Αν στη θέση του pattern χρησιμοποιηθεί ο χαρακτήρας . (τελεία) τότε σημαίνει οποιαδήποτε λέξη.
-v --invert-match
-w --word-regexp
-c --count
-l --files-with-matches
split
Η split χωρίζει ένα αρχείο σε μικρότερα ανάλογα με το μέγεθος που θα οριστεί. Αν δεν δοθεί μέγεθος
τότε χωρίζει το αρχείο ανά 1000 γραμμές. Τα νέα αρχεία που δημιουργούνται ονομάζονται με τη σειρά
xaa xab xac xad κ.ο.κ
split [options] [input [prefix]]
Παράδειγμα 1:
split /var/log/messages
Διάσπαση του αρχείου messages σε αρχεία μεγέθους 1000 γραμμών το κάθε ένα.
Παράδειγμα 2:
split -l 3 /etc/passwd
Διάσπαση του αρχείου passwd σε αρχεία μεγέθους 3 γραμμών το κάθε ένα
Παράδειγμα 3:
cut
Εμφανίζει συγκεκριμένο τμήμα κάθε γραμμής από το αρχείο
cut [options] [file]
Παράδειγμα 1:
Παράδειγμα 2:
sort
Ταξινομεί την είσοδο αλφαβητικά. Η προκαθορισμένη ταξινόμηση είναι αλφαριθμητική ενώ υπάρχει
δυνατότητα και για αριθμητική ταξινόμηση.
sort [options] [file]
Παράδειγμα 1:
sort /etc/passwd
Αλφαριθμητική ταξινόμηση του αρχείου passwd.
Παράδειγμα 2:
Παράδειγμα 3:
sort -n passwd2
Δημιουργία του αρχείου passwd2 που περιέχει το 3ο πεδίο (σπάζοντας κάθε γραμμή με βάση τον
χαρακτήρα :) κάθε γραμμής του αρχείου passwd (το 3ο πεδίου του συγκεκριμένου αρχείο είναι ένας
αριθμός). Κατόπιν αριθμητική ταξινόμηση του αρχείου passwd2.
Η εντολή uniq
Απόρριψη όλων εκτός από μίας των διαδοχικά ίδιων γραμμών της εισόδου και εμφάνισή τους στην
έξοδο
uniq [options] [input [output]]
Παράδειγμα:
Ερωτήσεις
home
ubuntu
LAB4
FOL1 FOL2
1. Δείτε τα περιεχόμενα των αρχείων short και Delim με διαχωρισμό και χωρίς διαχωρισμό
ανάμεσα στα περιεχόμενα των δύο αρχείων.
2. Δείτε τις 20 πρώτες γραμμές του αρχείου long. Δείτε τις 10 τελευταίες του ίδιου αρχείου.
3. Βρείτε τα αρχεία που είναι κάτω από τον φάκελο LAB4 που το όνομά τους περιέχει τον
χαρακτήρα 0 και που το μέγεθός τους δεν είναι πάνω από 500Kbytes.
4. Βρείτε πόσες γραμμές του αρχείου long δεν περιέχουν τη λέξη usr
5. Το αρχείο Delim περιέχει σε κάθε γραμμή του πληροφορίες για ένα χρήστη (username και
userid). Δημιουργήστε ένα αρχείο που θα περιέχει μόνο τα userids των χρηστών.
6. Μετρήστε σε πόσες διαφορετικές γραμμές εμφανίζεται η λέξη Line αδιαφορώντας για το case σε
όλα τα αρχεία του φακέλου FOL1.
7. Μετρήστε σε πόσες διαφορετικές γραμμές εμφανίζεται η λέξη Line αδιαφορώντας για το case σε
όλα τα αρχεία του φακέλου LAB4.
8. Δημιουργήστε ένα αρχείο κάτω από τον φάκελο LAB4 που θα περιέχει τις 2 πρώτες και τις δύο
τελευταίες γραμμές του αρχείου Delim
9. Δημιουργήστε ένα αρχείο κάτω από τον φάκελο LAB4 που θα περιέχει τη δεύτερη γραμμή του
αρχείου short.