Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεἈναίτις Νικολαΐδης Τροποποιήθηκε πριν 6 χρόνια
1
Το Περιβάλλον Προγραμματισμού της εντολής awk
7ο ΕΡΓΑΣΤΗΡΙΟ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
2
Η εντολή awk Προέλευση του ονόματος : Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan - awk Η λειτουργία awk είναι μια γλώσσα διεργασιών και ταυτοποίησης προτύπων με σημαντική ισχύ. Αναλύει και διαχειρίζεται ένα ή περισσότερα αρχεία ελέγχοντας τις εγγραφές που ταιριάζουν σε ένα πρότυπο. Χρησιμοποιεί το συντακτικό της γλώσσας C και λειτουργεί μόνον με αρχεία κειμένου. Οι λειτουργίες που μπορεί να πραγματοποιήσει μπορούν να υλοποιηθούν με πολλούς τρόπους. Στην απλή της μορφή λειτουργεί με τα συνήθη input και output streams. Ένα πρόγραμμα σε awk γράφεται ΚΑΤΑΡΧΗΝ στη γραμμή εντολών και περικλείεται σε ‘ ‘. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
3
Ένα πρόγραμμα σε awk περιλαμβάνει όλα τα συστατικά ενός προγράμματος : δεσμευμένες λέξεις, σταθερές, μεταβλητές, εντολές, συναρτήσεις, πίνακες κλπ. Κάθε πρόγραμμα σε awk χρησιμοποιεί ένα αρχείο κειμένου ως αρχείο εισόδου και κάθε εντολή (εκτός των εντολών που οριοθετούν οι περιοχές BEGIN και END) επενεργεί κατά σειρά σε κάθε γραμμή του αρχείου εισόδου. Κάθε γραμμή του αρχείου εισόδου μπορεί να διαχωριστεί σε πεδία που μπορούν να διαχειριστούν ανεξάρτητα. Η εντολή μπορεί να χρησιμοποιεί κανονικές εκφράσεις για να αναζητήσει πρότυπα στο αρχείο εισόδου. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
4
Εκδόσεις της awk awk – αρχική έκδοση
nawk - new awk – βελτιωμένη έκδοση της awk gawk - gnu awk - βελτιωμένη έκδοση της nawk ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
5
Γενική δομή των εντολών της awk
Ένα πρόγραμμα σε awk ίσως να περιλαμβάνει πολλές εντολές που διαχωρίζονται από τις υπόλοιπες με ; ή με αλλαγή γραμμής (\n) Κάθε ενέργεια μπορεί να περιλαμβάνει πολλές εντολές που διαχωρίζονται από τις υπόλοιπες με ; ή με αλλαγή γραμμής (\n) Τα σχόλια ξεκινούν με #, και συνεχίζουν έως το τέλος της γραμμής. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
6
Επιλογές της εντολής Συνήθης χρήση της εντολής :
$awk –Fc ‘ { program } ’ input_file Η επιλογή -F χρησιμοποιεί τον χαρακτήρα που προδιαγράφεται ως διαχωριστή πεδίων και όχι τον εξ ορισμού διαχωριστή (είναι το κενό διάστημα) Με την επιλογή -f η εντολή διαβάζει το σενάριο (το πρόγραμμα) από το αρχείο που προσδιορίζεται με την επιλογή αυτή και όχι από τη γραμμή εντολών π.χ. $awk -f myawkscript input_file ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
7
Σταθερές & Τελεστές Τα αλφαριθμητικά περικλείονται σε εισαγωγικά (")
Οι κανονικές εκφράσεις οριοθετούνται με / =, +, -, *, /, % Οι τελεστές εκχώρησης και πράξεων της γλώσσας C ~ , !~ Ταιριάζει , δεν ταιριάζει ^ Ύψωση σε δύναμη ++, -- Αύξηση, μείωση τιμής μεταβλητής ?: conditional operator ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
8
Μεταβλητές Μπορούν να μη δηλωθούν, να περιέχουν οποιοδήποτε τύπο δεδομένων και είναι case sensitive Ο τύπος δεδομένων που αντιπροσωπεύει μια μεταβλητή μπορεί να αλλάζει κατά τη διάρκεια ζωής του προγράμματος. Ως ονόματα γίνονται αποδεκτά όσα εναρμονίζονται με τους γνωστούς κανόνες ονοματοδοσίας αναγνωριστικών των σύγχρονων γλωσσών προγραμματισμού (πρώτος χαρακτήρας γράμμα και στη συνέχεια γίνονται αποδεκτά γράμματα, ψηφία και υπογραμμίσεις (underscores) ) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
9
Μεταβλητές Μεταβλητές γενικού τύπου π.χ.
title=”Number of students” , no=100, weight=77.9 ΕΙΔΙΚΕΣ (δεσμευμένες) ΜΕΤΑΒΛΗΤΕΣ $n n-οστό πεδίο στη γραμμή, $0 – ολόκληρη η γραμμή FS διαχωριστής πεδίων (εξ ορισμού κενό και tab) OFS διαχωριστής πεδίων αρχείου εξόδου (εξ ορισμού κενό) NR αριθμός εγγραφής (γραμμής) NF πλήθος πεδίων της γραμμής FILENAME όνομα αρχείου εισόδου RS διαχωριστής εγγραφών αρχείου εισόδου (εξ ορισμού new line) ORS διαχωριστής εγγραφών αρχείου εξόδου (εξ ορισμού new line) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
10
Κάθε εγγραφή διαχωρίζεται σε πεδία με ονόματα $1, $2, κλπ
Πεδία Κάθε εγγραφή διαχωρίζεται σε πεδία με ονόματα $1, $2, κλπ $0 : είναι το όνομα για ολόκληρη την εγγραφή NF : περιέχει το πλήθος των πεδίων της τρέχουσας γραμμής FS : περιέχει τον διαχωριστή πεδίων με εξ ορισμού τιμές κενό και TAB Τα πεδία είναι προσπελάσιμα μέσω των ονομάτων τους ($n-οστό πεδίο) είτε μέσω μεταβλητών π.χ. $var όπου η μεταβλητή var έχει τιμή στο διάστημα [0 –NF] ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
11
Προγράμματα και λειτουργίες (1)
Τα προγράμματα awk διαιρούνται σε τρία κύρια blocks: BEGIN block, block επεξεργασίας, END block. Εκτός και αν ορίζεται ρητά, όλες οι εντολές εμφανίζονται στο block επεξεργασίας. Οποιοδήποτε από τα 3 τμήματα μπορεί να παραλείπεται. Οι εντολές διαιρούνται σε δύο τμήματα: Ένα κριτήριο επιλογής, που αναφέρει στην awk τι πρέπει να ταιριάξει, και Μια αντίστοιχη ενέργεια που αναφέρει στην awk τι θα κάνει όταν βρεθεί μια γραμμή που ταιριάζει με το συγκεκριμένο κριτήριο επιλογής. Το τμήμα ενεργειών της εντολής βρίσκεται σε { } και μπορεί να περιέχει πολλές εντολές. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
12
Προγράμματα και λειτουργίες (2)
Ένα κριτήριο επιλογής μπορεί να είναι είτε μια κανονική έκφραση είτε μια λογική έκφραση που επιστρέφει τιμή true ή false. Οι εντολές που διαθέτουν κριτήριο επιλογής εφαρμόζονται σε κάθε γραμμή που αντιστοιχεί ή καθιστά αληθές το κριτήριο, ανάλογα αν αυτό είναι μια κανονική έκφραση ή μια λογική έκφραση. Οι εντολές που δεν έχουν κριτήρια επιλογής εφαρμόζονται σε κάθε γραμμή του αρχείου εισόδου. Κάθε κριτήριο επιλογής ελέγχεται ξεχωριστά για κάθε γραμμή του αρχείου εισόδου, μέχρι να διαβαστεί όλο το αρχείο εισόδου. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
13
Προγράμματα και λειτουργίες (3)
Εκτέλεση των blocks BEGIN { …. } { …. } /pattern/ { ….. } END { Εκτελείται μόνο 1 φορά πριν την ανάγνωση των δεδομένων εισόδου Εκτέλεση για κάθε γραμμή εισόδου Εκτέλεση για κάθε γραμμή εισόδου που ταιριάζει με το πρότυπο Εκτελείται στο τέλος μετά την επεξεργασία όλων των γραμμών του αρχείου εισόδου ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
14
Προγράμματα και λειτουργίες (4)
Εκτελείται το BEGIN block Εκχωρούνται οι τιμές στις μεταβλητές της γραμμής εντολών Για κάθε γραμμή του αρχείου εισόδου διαβάζεται και αποδίδονται τιμές στις NR, NF, $i, κλπ για κάθε εντολή αξιολογούνται τα αντίστοιχα κριτήρια Αν τα κριτήρια είναι αληθή / αντιστοιχούνται η εντολή εκτελείται Μετά την ανάγνωση όλου του αρχείου εισόδου εκτελείται το END block ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
15
Αντιστοίχιση προτύπων
Κάθε γραμμή πριν επεξεργαστεί μπορεί να αντιστοιχηθεί (να ταιριάξει με ένα πρότυπο). Το πρότυπο περικλείεται σε / /. Format : /pattern/ { action } εκτελείται αν η γραμμή περιέχει το πρότυπο !/pattern/ { action } εκτελείται αν η γραμμή ΔΕΝ περιέχει το πρότυπο παραδείγματα: /^$/ { print “This line is blank “ } /text/ { print “This line includes text” } /[0-9]+$/ { print “Integer:”, $0 } /[a-z]+/ { print “String:”, $0 } /^[A-Z]/ { print “start with an uppercase letter” } ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
16
Παράδειγμα - 1 /^5/ {print $0}
Πρότυπο : /^5/ όλες οι γραμμές που ξεκινούν με το ψηφίο 5. Ενέργεια : εκτύπωση ολόκληρης της γραμμής ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
17
Παράδειγμα - 2 $ ls -l | awk '{print $3}'
Παράδειγμα : $ ls -l | awk '{print $3}' εμφανίζει την τρίτη στήλη κάθε γραμμής που προκύπτει από την ls. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
18
Εντολή print print : εμφανίζει κάθε μία από τις τιμές των πεδίων $1 έως $NF με διαχωριστή εξόδου τον OFS και διαχωριστή εγγραφών (γραμμών) τον ORS στην έξοδο (stdout). Η εξ ορισμού τιμή του OFS είναι το κενό διάστημα και του η αλλαγή γραμμής (\n) print value value ... : εμφανίζει τις τιμές με τη σειρά που δίνονται, χωρίς διαχωριστικά, στην έξοδο (stdout) και στο τέλος χρησιμοποιεί και τον ORS ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
19
Εντολή printf printf(format,value,value,...) : εμφανίζει τις τιμές χρησιμοποιώντας το format, όπως ακριβώς στη γλώσσα C. Δεν χρησιμοποιεί την αλλαγή γραμμής (\n), συνεπώς μπορούν να χρησιμοποιηθούν πολλές εντολές printf για να συνθέσουν μια γραμμή εξόδου. Πρέπει να υπάρχει αντιστοιχία μεταξύ των τιμών και των format. Οι τιμές που εμφανίζονται στις εντολές print και printf μπορούν να είναι σταθερές, μεταβλητές ή εκφράσεις, με οποιαδήποτε σειρά. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
20
%s εμφάνιση αλφαριθμητικού %[n]d εμφάνιση ακεραίου σε n στήλες
printf formats %s εμφάνιση αλφαριθμητικού %[n]d εμφάνιση ακεραίου σε n στήλες %[[n].m]f εμφάνιση αριθμού τύπου floating point σε n στήλες με m δεκαδικά ψηφία %c εμφάνιση ακεραίου υπό μορφή απλού χαρακτήρα ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
21
Παράδειγμα - 3 $cat names.txt Per Wisung Jan Medin Hans Persson Göran Persson $awk ´{print “Name: ”, $1,$2, “Telephone:”, $3} ´ names.txt Name: Per Wisung Telephone: Name: Jan Medin Telephone: Name: Hans Persson Telephone: 021 Name: Göran Persson Telephone: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
22
Παράδειγμα - 4 awk ´ BEGIN { print “ Name Telephone”}
{ printf(“%d %-5s %-15s %s\n”, NR, $1,$2,$3) } END { print “ ” print “Total: “, NR } ´ names.txt NR = number of record = πλήθος των γραμμών που διαβάζονται από την εντολή awk ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
23
Παράδειγμα - 5 $ cat sales John Anderson,12,23,7,42
Joe Turner,10,25,15,50 Susan Greco,15,13,18,46 Bob Burmeister,8,21,17,46 $ awk -F, '{print $1,$5}' sales John Anderson 42 Joe Turner 50 Susan Greco 46 Bob Burmeister 46 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
24
Παράδειγμα - 6 $ cat emp.data John Anderson:sales:1980
Joe Turner:marketing:1982 Susan Greco:sales:1985 Ike Turner:pr:1988 Bob Burmeister:accounting:1991 $ awk -F: '$3 == 1980,$3 == 1985 {print $1, $3}' emp.data John Anderson 1980 Joe Turner 1982 Susan Greco 1985 Range pattern : '$3 == 1980, $3 == 1985 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
25
Παράδειγμα - 7 $ cat monthly.sales John Anderson,12,23,7
Joe Turner,10,25,15 Susan Greco,15,13,18 Bob Burmeister,8,21,17 $cat total.awk BEGIN {FS=","; #Input fields are seperated by commas OFS=",";} #Put a comma in the output {print $1, " monthly sales summary: " $2+$3+$4 } $ awk -f total.awk monthly.sales John Anderson, monthly sales summary: 42 Joe Turner, monthly sales summary: 50 Susan Greco, monthly sales summary: 46 Bob Burmeister, monthly sales summary: 46 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
26
Εντολές προγραμματισμού
if (boolean) statement1 else statement2 for (v=init;boolean;v change) statement while(boolean) statement do statement while(boolean) break continue next exit ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
27
Συντακτικό των εντολών - παραδείγματα
if ( found == true ) # if (expr) print “Found” # {action1} else # else print “Not found” # {action2} while ( i <= 100) # while (cond.) { i=i+1; print i } # {action} do # do { i=i+1; print i } # {action} while ( i<100) # while (cond.) for (i=1; i<10; i++ ) { # for (set; test;increment) i2= i*i # {action} printf(“ %d*%d = %d\n”, i, i, i2) } ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
28
Ενσωματωμένες συναρτήσεις χειρισμού αλφαριθμητικών
substr(s,p,n) αντίγραφο (υποσύνολο) από το αλφαριθμητικό s που ξεκινά από τη θέση p και έχει μήκος n χαρακτήρες. Αν το n παραλειφθεί λαμβάνεται το υπόλοιπο του s από τη θέση p και μετά index(s1,s2) η πρώτη θέση όπου θα βρεθεί το αλφαριθμητικό s2 μέσα στο s1. επιστρέφει 0 αν δεν βρεθεί length(e) το μήκος του αλφαριθμητικού e ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
29
Ενσωματωμένες μαθηματικές συναρτήσεις
sin, cos, tan atan2(x,y) exp, log srand(s), rand() int(expr) – επιστρέφει το ακέραιο μέρος της τιμής της expr αποκόπτοντας όλα τα δεκαδικά ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
30
Παράδειγμα - 8 $awk '{print NF ": " $0}' I am testing my typing.
A quick brown fox jumps when vexed by lazy ducks. Ctrl+D (εισαγωγή χαρακτήρα τέλους αρχείου από το πληκτρολόγιο) 5: I am testing my typing. 10: A quick brown fox jumps when vexed by lazy ducks. $ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
31
Παράδειγμα - 9 $ who | awk ‘{ print }’ root console Nov 9 07:31
yuenca ttyAo Nov 27 17:39 limyx4 ttyAp Nov 27 16:22 wifey ttyAx Nov 27 17:16 tobster ttyAz Nov 27 17:59 taylor ttyqh Nov 27 17:43 Η print εμφανίζει τις γραμμές του αρχείου που χρησιμοποιείται ως όρισμα Μια γραμμή μπορεί να διαχωριστεί σε πεδία πληροφοριών χρησιμοποιώντας μοναδικά αναγνωριστικά με ονόματα $1, $2, $3 κλπ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
32
Παράδειγμα - 10 $ who | awk ‘{ print $1 }’ root yuenca limyx4 wifey
tobster taylor ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
33
Παράδειγμα - 11 $ who | awk ‘{ print “User “ $1 “ is on terminal line “ $2 }’ User root is on terminal line console User yuenca is on terminal line ttyAo User limyx4 is on terminal line ttyAp User hawk is on terminal line ttyAw User wifey is on terminal line ttyAx user taylor is on terminal line ttyqh Η print μπορεί να χρησιμοποιήσει και οποιοδήποτε κείμενο μέσα σε διπλά εισαγωγικά Μπορούν να χρησιμοποιηθούν απλά εισαγωγικά; ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
34
Παράδειγμα - 12 Μετρά τον αριθμό πεδίων σε κάθε γραμμή
$ who | head -3 | awk ‘{ print NF }’ 5 Αν χρησιμοποιηθεί το NF με $ εμφανίζει την τιμή του τελευταίου πεδίου !!!!! $ who | head -3 | awk ‘{ print $NF }’ 07:31 16:22 18:21 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
35
Περιεχόμενα του αρχείου /etc/passwd
root:x:0:0:Super-User:/:/bin/csh sysadm:x:0:0:System V Administration:/usr/admin:/bin/sh cmwlogin:x:0:994:CMW Login UserID:/usr/CMW:/sbin/csh diag:x:0:996:Hardware Diagnostics:/usr/diags:/bin/csh daemon:x:1:1:daemons:/:/dev/null bin:x:2:2:System Tools Owner:/bin:/dev/null uucp:x:3:5:UUCP Owner:/usr/lib/uucp:/bin/csh sys:x:4:0:System Activity Owner:/var/adm:/bin/sh adm:x:5:3:Accounting Files Owner:/var/adm:/bin/sh lp:x:9:9:Print Spooler Owner:/var/spool/lp:/bin/sh auditor:x:11:0:Audit Activity Owner:/auditor:/bin/sh dbadmin:x:12:0:Security Database Owner:/dbadmin:/bin/sh guest:x:998:998:Guest Account:/usr/people/guest:/bin/csh ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
36
Παράδειγμα - 13 $ grep Owner /etc/passwd | awk -F: ‘{ print $1 “ has “ $7 ” as login shell” }’ bin has /dev/null as login shell uucp has /bin/csh as login shell sys has /bin/sh as login shell adm has /bin/sh as login shell lp has /bin/sh as login shell auditor has /bin/sh as login shell dbadmin has /bin/sh as login shell Σημείο διαχωρισμού των πεδίων το : (διακόπτης –F:) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
37
Παράδειγμα - 14 Δημιουργία λίστας με τους χρήστες του συστήματος με μήκος login name έως 4 χαρακτήρες $ grep “^[^:]\{1,4\}:” /etc/passwd | awk -F: ‘{print $5}’ Super-User Hardware Diagnostics System Tools Owner UUCP Owner System Activity Owner Accounting Files Owner Print Spooler Owner ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
38
Παράδειγμα - 15 63 /bin/csh 1 /bin/ksh 1462 /bin/sh 8 /bin/tcsh
$ awk -F: ‘{print $7}’ /etc/passwd | sort | uniq -c 63 /bin/csh 1 /bin/ksh 1462 /bin/sh 8 /bin/tcsh 10 /dev/null 1 /sbin/csh 1 /usr/bin/tcsh 1 /usr/lib/uucp/uucico 2 /usr/local/sbin/noaitisi_shell Εμφανίζει τα διαφορετικά login shells που υπάρχουν στο σύστημα καθώς και το πλήθος εμφάνισης καθενός στο αρχείο /etc/passwd (τα στοιχεία αφορούν το αρχείο /etc/passwd ενός συστήματος Unix και όχι το αρχείο που αναφέρεται στη διαφάνεια 31) Η εντολή uniq επεξεργάζεται ένα αρχείο περιορίζοντας ή αναφέροντας διαδοχικές γραμμές ίδιες μεταξύ τους (ο διακόπτης –c είναι ένας μετρητής που δείχνει πόσες φορές επαναλαμβάνεται, και προηγείται κάθε γραμμής εξόδου). Τι σημαίνει το 2; ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
39
Παράδειγμα - 16 1 /bin/csh 5 /bin/sh 1 /dev/null
$ grep “Owner” /etc/passwd | awk -F: ‘{print $NF}’ | sort | uniq -c 1 /bin/csh 5 /bin/sh 1 /dev/null $ awk -F: ‘{ if (length($1) == 2) print $0 }’ /etc/passwd | wc -l 1 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
40
Παράδειγμα - 17 $ ls -l | awk ‘{ print NR”: “$0 }’
1:total 1679 2:drwx stefanos mkpasswd Nov 9 03:52 AWK-UNIX 3:drwx stefanos mkpasswd Nov 4 21:51 CD-UNIX-BOOKS 4:-rwx stefanos mkpasswd Aug 10 21:07 GWORDW.lnk 5:drwx stefanos mkpasswd Nov 9 03:14 LINUX-LAB10-NOV 6:-rwx stefanos mkpasswd Nov 5 12:59 WinASO RegDefrag 1.0.lnk 7:-rwx stefanos mkpasswd Nov 8 16:38 apr-05.doc 8:drwx stefanos mkpasswd Nov 3 18:41 grass 9:drwx stefanos mkpasswd Oct 27 14:00 joiners 10:-rwx stefanos mkpasswd Nov 7 19:21 jokes-ppt.ppt 11:drwx stefanos mkpasswd Nov 6 21:14 mobile 12:-rwx stefanos mkpasswd Nov 11 22:09 passwd.txt 13:-rw-rw-rw stefanos mkpasswd May pattern 14:drwx stefanos mkpasswd Oct 26 23:18 ram-hp-extension 15:drwx stefanos mkpasswd Nov 5 15:02 regseeker 16:drwx stefanos mkpasswd Nov 9 00:55 unix-03-nov-2005 17:drwx stefanos mkpasswd Nov 5 12:44 utilities-2005 NR =Number of Records (πλήθος γραμμών) Το $0 είναι ολόκληρη η γραμμή ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
41
Παράδειγμα - 18 $ ls -lF | awk ‘{ print $9 “ “ $5 }’ AWK-UNIX/ 0
CD-UNIX-BOOKS/ 0 New 674 Org_nov-dec_2005_temp.xls* 23552 WS_FTP 1576 WinASO 736 apr-05.doc* 33792 grass/ 0 joiners/ 0 jokes-ppt.ppt* mobile/ 0 passwd.txt* 645 pattern 156 ram-hp-extension/ 0 regseeker/ 0 utilities-2005/ 0 Λίστα των αρχείων με το μέγεθός τους ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
42
Παράδειγμα - 19 $ ls -l | awk ‘{print $5"\t” $9 }’ | sort -rn | head -5 utilities-2005/ 0 unix-03-nov-2005/ regseeker/ ram-hp-extension/ pattern 156 Sort –rn reverse και χειρίζεται το κλειδί ως αριθμό (n) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
43
Παράδειγμα - 20 $ ls -l | awk ‘{print $5}’ 449536 478 674 23552 724
24576 1576 696 736 33792 645 156 1673 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
44
Παράδειγμα - 21 $ ls -l | awk ‘{ totalsize = totalsize + $5; print totalsize }’ 449536 450014 450688 474240 474964 499540 501116 501812 502548 536340 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
45
Παράδειγμα - 22 $ ls -l | awk ‘{ totalsize += $5; print totalsize }’ | tail -1 $ ls -l | awk ‘{ totalsize += $5 } END { print totalsize }’ $ ls -l | awk ‘{ totalsize += $5 } END { print “You have a total of” totalsize “ bytes used across “NR” files.” }’ You have a total of bytes used across 14 files. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
46
Παράδειγμα - 23 $ cat << EOF > script { totalsize += $5 }
END { print “You have a total of “totalsize \ “ bytes used across “NR” files.” } EOF $ ls -l | awk -f script You have a total of bytes used across 14 files. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
47
Πίνακες στην awk (1) Οι πίνακες στην awk, όπως και οι απλές μεταβλητές, δεν χρειάζεται να δηλωθούν (δηλ. δεν υπάρχει τμήμα δήλωσης του πίνακα). Επιπλέον δεν απαιτείται ούτε η δήλωση του μεγέθους δηλ. προγραμματιστικά οι πίνακες είναι δυναμικοί. Για τη δημιουργία ενός πίνακα πρέπει απλά να δοθεί το όνομά του και ο δείκτης, μετά το όνομα, μέσα σε [ ]. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
48
Πίνακες στην awk (2) Η εντολή awk υποστηρίζει δύο τύπους πινάκων - standard και general Οι standard πίνακες χρησιμοποιούν ως δείκτες ακεραίους με πρώτο στοιχείο αυτό με δείκτη 0. Υποστηρίζονται πίνακες πολλών διαστάσεων οι οποίοι λειτουργούν όπως στη γλώσσα C Οι general πίνακες μπορούν να έχουν ως δείκτη οποιονδήποτε τύπο μεταβλητής. Η χρήση της εντολής for (a in x) σε ένα γενικευμένο πίνακα θα επιστρέψει όλες τις τιμές των δεικτών με κάποια σειρά, όχι όμως απαραίτητα αυτήν που επιθυμούμε ανά περίπτωση. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
49
Πίνακες στην awk (3) Οι πίνακες της awk είναι διαφορετικοί από τους συνήθεις πίνακες στις γλώσσες προγραμματισμού. Οι δείκτες του πίνακα αποθηκεύονται ως αλφαριθμητικά και όχι ως αριθμοί!. Εντολή : for (v in array) statement εκχωρεί στη μεταβλητή v κάθε μία από τις τιμές που λαμβάνει ο δείκτης του γενικευμένου πίνακα array, όχι με κάποια συγκεκριμένη σειρά, και στη συνέχεια εκτελεί την εντολή statement ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
50
Παράδειγμα - 24 $awk -F"\t" '{ a[$1]=$1;sum+=$1; print $1, $2, $3;} END {for (i in a) print (a[i]); print sum}' maths Δημιουργεί ένα πίνακα a με περιεχόμενα την 1η στήλη ($1) του αρχείου maths, υπολογίζει το άθροισμα των τιμών της 1ης στήλης (sum) και στο τέλος εμφανίζει τα στοιχεία του πίνακα a και το άθροισμά τους. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
51
Παράδειγμα - 25 $ cat << EOF > awkscript {
count[length($1)]++ } END { for (i=1; i < 9; i++) print “There are “ count[i] “ accounts with “ i “ letter names.” EOF $ awk -F: -f awkscript /etc/passwd There are 0 accounts with 1 letter names. There are 1 accounts with 2 letter names. There are 3 accounts with 3 letter names. There are 3 accounts with 4 letter names. There are 1 accounts with 5 letter names. There are 2 accounts with 6 letter names. There are 2 accounts with 7 letter names. There are 1 accounts with 8 letter names. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
52
Παράδειγμα - 26 $ awk -F: ‘{ if (length($1) = 2) print $0 }’ /etc/passwd awk: syntax error near line 1 awk: illegal statement near line 1 $ awk -F: ‘{ if (length($1) == 2) print $0 }’ /etc/passwd lp:x:9:9:Print Spooler Owner:/var/spool/lp:/bin/sh Η πρώτη μορφή έχει συντακτικό λάθος στη σύγκριση , έχει ένα = Η 2η μορφή εμφανίζει το account που έχει ένα χαρακτήρα μήκος ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
53
Παράδειγμα - 27 $awk '{ if (length($0) > max)
max = length($0);w=NR } END { print max ,w}' data εμφανίζει το μήκος και τον α/α της μεγαλύτερης γραμμής του αρχείου data This program prints a sorted list of the login names of all users. This program counts lines in a file. This program prints every line that has at least one field. This program prints the length of the longest input line. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
54
Παράδειγμα - 28 Να γράψετε ένα πρόγραμμα awk που εκτυπώνει τα περιεχόμενα ενός directory στην παρακάτω μορφή : BYTES FILE copyfile copyfile.c copyfile.c~ dirlist dirlist.c dirlist.c% envadv envadv.c <dir> tmp x.c Total: bytes (9 files) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
55
input to awk ls -l total 84 -rwxr-xr-x 1 icrnkovi 2457 Mar 5 13:23 copyfile -rwxrwxrwx 1 icrnkovi 736 Mar 5 13:22 copyfile.c -rw-r--r-- 1 icrnkovi 740 Mar 5 11:53 copyfile.c~ -rwxr-xr-x 1 icrnkovi Mar 5 17:50 dirlist -rw-r--r icrnkov 989 Mar 5 17:50 dirlist.c -rw-r--r icrnkovi 977 Mar 5 17:50 dirlist.c% -rwxr-xr-x 1 icrnkov Mar 5 13:29 envadv -rwxrwxrwx 1 icrnkovi 185 Mar 5 12:11 envadv.c -rw-r--r icrnkov 0 Mar 5 18:27 ls.txt -rw-r--r icrnkovi 383 Mar 5 18:21 lt.txt drwxr-xr-x 3 icrnkovi 512 Mar 5 16:46 tmp -rw-r--r icrnkov 740 Mar 5 13:25 x. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
56
awk code ls -l | awk ‘ BEGIN { print “ BYTES FILE”; sum=0; filenum=0 }
# test for ls -l output files and starting with - if NF == 8 && /^-/ { sum += $ filenum printf (“%10d %s\n”, $4, $8) } # test for directories - line starts with d if NF ==8 && /^d/ { print “<dir> “, $8 } # finally END { print “\nTotal: “, sum, “bytes (“, filenum, “files)” }’ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
57
Παράδειγμα - 29 awk ' # sum1 - print column sums
# input: rows of numbers output: sum of each column # missing entries are treated as zeros { for (i = 1; i <= NF; i++) sum[i] += $i if (NF > maxfld) maxfld = NF } END { for (i = 1; i <= maxfld; i++) { printf("%g", sum[i]) if (i < maxfld) printf("\t") else printf("\n") ' input_file 2>&1 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
58
Παραδείγματα length($0)>72
εμφανίζει όλες τις γραμμές με μήκος μεγαλύτερο των 72 χαρακτήρων {$2="";print} διαγράφει το δεύτερο πεδίο από κάθε γραμμή awk 'NF > 0' data εμφανίζει όλες τις μη κενές γραμμές του αρχείου data /Ucast/{print $1 "=" $NF} για κάθε γραμμή που περιέχει το αλφαριθμητικό 'Ucast' εμφανίζει το πρώτο πεδίο, το σύμβολο = και το τελευταίο πεδίο BEGIN {FS="/"}; NF<4 χρησιμοποιεί ως διαχωριστή πεδίων το σύμβολο '/', και εμφανίζει μόνον τις γραμμές με λιγότερα από 4 πεδία ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
59
Παραδείγματα awk ‘{ print NR”:”$0 } test
Εμφανίζει μπροστά από κάθε γραμμή τον α/α και το : awk ‘length($0)>30 {print $0}’ test1 Εμφανίζει όλες τις γραμμές του αρχείου test1 με μήκος μεγαλύτερο των 30 χαρακτήρων awk –F. ‘/teithe/ {print $1 “,” NF}’ http Εμφανίζει για κάθε γραμμή του αρχείου http, στην οποία υπάρχει το pattern teithe, το 1ο πεδίο και το πλήθος των πεδίων με διαχωριστικό εξόδου το , awk ‘/info/ {nlines++} END {print nlines}’ in_file εμφανίζει το συνολικό αριθμό των γραμμών που περιέχουν τη λέξη info ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
60
Παραδείγματα awk '$1 != prev { print; prev = $1 }' file
εμφανίζει όλες τις γραμμές των οποίων το πρώτο πεδίο είναι διαφορετικό από το προηγούμενο awk '$1 > $2 {print $3}' file εμφανίζει το 3ο πεδίο αν ισχύει ότι το 1ο πεδίο είναι μεγαλύτερο από το 2ο πεδίο awk '$3 > $2' file εμφανίζει όλη τη γραμμή αν το 3ο πεδίο είναι μεγαλύτερο από το 2ο ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
61
Παραδείγματα βρίσκει τη μέγιστη και την ελάχιστη τιμή του 1ου πεδίου
NR == 1 {m=$1 ; p=$1} $1 >= m {m = $1} $1 <= p {p = $1} END { print "Max = " m, " Min = " p } ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
62
Άσκηση -1 Να γραφεί μια σύνθετη εντολή (συνδυασμός ls και awk) που θα εμφανίζει το πλήθος των αρχείων και καταλόγων του τρέχοντος καταλόγου και το συνολικό χώρο που καταλαμβάνουν στον δίσκο. $ls –l |awk ‘n++; s+=$5;print}; END {n “ “ s}’ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
63
Άσκηση -2 Δίνεται αρχείο που περιέχει σε κάθε γραμμή το όνομα της πόλης, τον πληθυσμό και τον αριθμό των αυτοκινήτων. Να γραφεί πρόγραμμα awk που θα εμφανίζει το αρχείο και θα υπολογίζει και θα εμφανίζει στο τέλος τα σύνολα πληθυσμού και αυτοκινήτων (διαχωριστικό στηλών το <TAB>). awk –F”\t” ‘BEGIN {print “CITY” “POPULATION” “CARS”}; {p+=$2;c+=$3;print $0); END {print “\t\t” p” “c}’ cities ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
64
Άσκηση -3 Να γραφεί πρόγραμμα σε awk που θα εμφανίζει τις γραμμές ενός αρχείου με αντίστροφη σειρά awk ‘{a[i++]=$0} END {for (j=i-1;j>=0;j--) print a[j]}’ cities ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
65
Άσκηση - 4 Δίνεται το παρακάτω αρχείο με γραμμογράφηση:
Αριθμός επιταγής, δικαιούχος, ποσό, κατηγορία 2501:Chester's Cholesterol Pit:21.56:food 2502:Harry's One-Stop Hospital:235.00:medical 2503:Lucrezia's Pharmacy:30.00:medical 2504:Cat Care Specialists:115.00:pet 2505:No Frills Supermarket:85.63:food 2506:Taco Frenzy:8.99:food 2507:The Kitty Boutique:56.09:pet 2508:Kitty Litter Factory Outlet:45.66:pet 2509:Grease All Over Yourself Drivein:10.50:food ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
66
Να γραφεί πρόγραμμα σε awk που θα εμφανίζει τα παρακάτω :
food 2501:Chester's Cholesterol Pit:21.56 2505:No Frills Supermarket:85.63 2506:Taco Frenzy:8.99 2509:Grease All Over Yourself Drivein:10.50 medical 2502:Harry's One-Stop Hospital:235.00 2503:Lucrezia's Pharmacy:30.00 pet 2504:Cat Care Specialists:115.00 2507:The Kitty Boutique:56.09 2508:Kitty Litter Factory Outlet:45.66 TOTALS food:126.68 medical:265 pet:216.75 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
67
Λύση άσκησης - 4 sort –t: -k 4 $1 | awk -F: ‘{ total[$4]+ =$3;
if (category!=$4) {print $4; category=$4} {print “\t” $1,$2,$3} } END {for (i in total) print (i “ “total[i]) }’ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
68
Άσκηση-5 Να γραφεί ένα πρόγραμμα σε awk που θα μετρά τη συχνότητα των λέξεων σε ένα αρχείο. $ awk -F: -f wf.awk indata.txt # wf.awk # counts frequence of words { for (i = 1; i <= NF; i++) num_word[tolower($i)] = num_word[tolower($i)] + 1 } END { for (word in num_word) print word, num_word[word] ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
69
Άσκηση -6 (Ιανουάριος 2005) Να δημιουργηθεί ένα αρχείο αφίξεων πτήσεων σε ένα αερολιμένα κατά την τελευταία εβδομάδα, ως εξής : Delta/7248/S-T-TF-/O-D-DO- Virgin/657/SM-W-FS/DO-O-DO Lufthansa/105/SMTW-FS/OODO-DO Virgin/212/---WT-S/---OO-D PanAm/411/SM-W—FS/OD-O-DD ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
70
Κάθε γραμμή του αρχείου περιλαμβάνει :
το όνομα της αεροπορικής εταιρείας, τον κωδικό της πτήσης, τις ημέρες της εβδομάδας που πραγματοποιήθηκε (S-Sunday, M-Monday, T-Tuesday κλπ) την κατάσταση άφιξης (το γράμμα O σημαίνει ONTIME ενώ το γράμμα D σημαίνει DELAYED). Χρησιμοποιώντας εντολές UNIX : Να δημιουργηθεί ένα νέο αρχείο που θα περιλαμβάνει για κάθε αεροπορική εταιρεία το πλήθος των πτήσεων που έφθασαν έγκαιρα και το πλήθος όσων είχαν καθυστέρηση. Οι υπολογισμοί θα γίνουν ανεξάρτητα του κωδικού πτήσης δηλαδή π.χ. για την Virgin θα γίνουν ενιαία και για τις δύο πτήσεις. Μπορείτε να χρησιμοποιήσετε την awk ή οποιαδήποτε άλλη εντολή. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
71
Λύση $ sed -e "s/-//g" <b2.txt | awk -F"/" '{ for (i=1;i<=length($4);i++) if (substr($4,i,1)=="O") pino[$1]++; else pind[$1]++ } END {for (i in pino) print i,pino[i],pind[i] }' ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
72
Άσκηση – 7 (Ιανουάριος 2005) Να δημιουργήσετε ένα αρχείο που περιέχει στοιχεία για τους χρήστες που διατηρούν λογαριασμούς σε δικτυακούς τόπους ή και σε εταιρείες παροχής υπηρεσιών Internet (ISP). Σε κάθε γραμμή του αρχείου υπάρχει το όνομα του δικτυακού τόπου ή του ISP, το είδος της σύνδεσης (τύπος και ταχύτητα) και το όνομα του συνδρομητή. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
73
το πλήθος των συνδέσεων ανά δικτυακό τόπο ή ISP και ταχύτητα δηλαδή:
Να γραφεί πρόγραμμα σε awk που θα βρίσκει και θα εμφανίζει, μόνον για συνδέσεις ADSL : το πλήθος των συνδέσεων ανά δικτυακό τόπο ή ISP και ταχύτητα δηλαδή: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
74
Λύση $ grep "ADSL" file | cut -d"/" -f1,2 | sed "s/ADSL://" | awk -F" " '{ pin[$1]++} END { for (i in pin) print i, pin[i]}' | sed "s/\// /" ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
75
Άσκηση – 8 (Ιανουάριος 2005) project1.f90 5
Να δημιουργήσετε ένα αρχείο δεδομένων που σε κάθε γραμμή περιέχει ένα όνομα αρχείου και το μέγεθός του σε Kb. Τα ονόματα αποτελούνται από οποιαδήποτε ακολουθία χαρακτήρων που περιέχει μόνον αλφαριθμητικούς χαρακτήρες και την τελεία ενώ διαχωρίζονται από το μέγεθος με ένα κενό διάστημα π.χ. project1.f90 5 sheet_milestone.freelance.win.xlw 33 codepro.source.c 7 alfadocument 127 demo50.fortran.f90 14 objectname.data.class.c 35 … ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
76
Στη συνέχεια να γραφεί πρόγραμμα σε awk που θα διαβάζει το αρχείο, θα βρίσκει και θα εμφανίζει:
Το πλήθος και το συνολικό μέγεθος ανά είδος αρχείου. Το είδος αρχείου καθορίζεται από το τελευταίο συστατικό του ονόματος (π.χ. f90, c, xlw κλπ). Τα αρχεία που δεν έχουν τέτοιο συστατικό να θεωρηθούν ως μια ενιαία κατηγορία. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
77
Λύση $ awk -F"." '{ if (NF==1) print "*",$1; else print $NF }' < file | awk -F " " '{ if (NF==3) pin[$1]+=$3; else pin[$1]+=$2} END {for (i in pin) print i,pin[i]}' ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 07
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.