ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ I Πιτροπάκης Νικόλαος Υποψήφιος Διδάκτορας Contact: npitrop@unipi.gr Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact: nifantop@unipi.gr
Life would be so much easier if we only had the source code.
ΚΑΝΟΝΙΚΕΣ ΕΚΦΡΑΣΕΙΣ Οι κανονικές εκφράσεις χρησιμοποιούνται από διάφορες εντολές στο unix και κυρίως από την sed, την grep και την awk, οι οποίες έχουν να κάνουν με την επεξεργασία συμβολοσειρών. [ ] Οτιδήποτε περιέχεται στις αγκύλες. Ταιριάζει με οποιονδήποτε χαρακτήρα Συμβολοσειρά$ Ταιριάζει patterns που τελειώνουν με τη Συμβολοσειρά ^Συμβολοσειρά Ταιριάζει patterns που αρχίζουν με τη Συμβολοσειρά /^$/ Ταιριάζει κενές γραμμές \ Ακυρώνει την ειδική σημασία των μεταχαρακτήρων
SED (1/7) Προκειμένου να αυτοματοποιήσουμε τις αλλαγές στα περιεχόμενα ενός αρχείου, κάνουμε χρήση κάποιων μηχανισμών. Ένας από αυτούς είναι η εντολή sed. Όπως είπαμε και πριν η sed υποστηρίζει κανονικές εκφράσεις και επίσης υποστηρίζει εντολές: Αντικατάστασης Διαγραφής Προσάρτησης Παρεμβολής και Αλλαγής Ας δούμε αναλυτικά κάθε δυνατότητα της sed
SED (2/7) Όσον αφορά τη δυνατότητα της αντικατάστασης κειμένου σε ένα αρχείο η sed συντάσσεται ως εξής: sed [επιλογές] s/παλιό κείμενο/νέο κείμενο/[παράμετροι] π.χ sed `s/palio/neo/` keimeno.txt Επιλογές [g] Εφαρμογή της αντικατάστασης σε όλες τις εμφανίσεις του κειμένου που αντικαθίσταται (global) π.χ sed `s/palio/neo/g` keimeno.txt [αριθμός] Εφαρμογή της αντικατάστασης στη nοστή εμφάνιση ανά γραμμή π.χ sed `s/palio/neo/3` keimeno.txt [w] Εγγραφή των αλλαγών σε αρχείο [p] Εμφάνιση στην οθόνη των γραμμών που αλλάχτηκαν [i] Αγνόηση για πεζά-κεφαλαία
SED (3/7) π.χ sed `s/palio/neo/3pw` keimeno.txt Επιλογές: -n Δεν εμφανίζει το αλλαγμένο αρχείο στην οθόνη (η sed από μόνη της εκτελεί μία cat μετά την ολοκλήρωσή της) π.χ sed -n `s/palio/neo/g` keimeno.txt -e Εκτέλεση περισσότερων αλλαγών π.χ sed -e `s/palio/neo/g` e`s/palio1/neo1/g` keimeno.txt -I Αποθήκευση των όποιων αλλαγών
SED (4/7) Σημαντικό! Μπορούμε να επιλέξουμε σε ποιες γραμμές θέλουμε να εφαρμοστεί η αντικατάσταση. π.χ sed -n `s/palio/neo/3` keimeno.txt Επίσης το σύμβολο & λαμβάνει την τιμή του νέου κειμένου π.χ sed -n `s/unipi.gr/nifantop@&/g` keimeno.txt Άλλα παραδείγματα sed s/^*a -Z][1-4+*//g keimeno.txt sed -i s/ \(^[0-9]\{2,3\}\)*/code removed/1
SED (5/7) Μία άλλη δυνατότητα της sed εκτός της αντικατάστασης είναι και η διαγραφή. Στην περίπτωση της διαγραφής έχουμε την εξής σύνταξη: sed /keimeno/d π.χ sed /skoupidia.txt/d` Πώς διαγράφουμε συγκεκριμένες γραμμές n,kd Διαγραφή των γραμμών από την n έως την k n,k!d Διαγραφή όλων των γραμμών εκτός των n με k n,$ Διαγραφή όλων των γραμμών από το n και κάτω π.χ sed 5,10d keimeno.txt sed 30,$ keimeno.txt sed 6,8!d keimeno.txt sed "/$kati/d keimeno.txt
SED (6/7) Μιλήσαμε για την αντικατάσταση και τη διαγραφή. Όμως η sed μας παρέχει επιπλέον προσάρτηση, παρεμβολή κειμένου και αλλαγή ολόκληρης γραμμής. Για να επιτύχουμε αυτές τις λειτουργίες, χρησιμοποιούμε τη σύνταξη: sed / palio/διακόπτης\neo Διακόπτες: a\ Προσάρτηση του νέου κειμένου στην επόμενη γραμμή από το παλιό i\ Παρεμβολή του νέου κειμένου στην πάνω γραμμή από το παλιό c\ Αλλαγή της γραμμής που περιέχεται το παλιό με το νέο
SED (7/7) Παραδείγματα: Imagine you have a large file ( txt, php, html, anything ) and you want to replace all the words "ugly" with "beautiful" because you just met your old friend Sue again and she/he is coming over for a visit. sed -i 's/ugly/beautiful/g' /home/bruno/old-friends/sue.txt Add this line after every line with WORD sed `/WORD/ a\ ` Delete all lines with sed cat /etc/passwd sed `d`
ΥΠΟΛΟΓΙΣΜΟΣ ΕΚΦΡΑΣΕΩΝ (1/3) Δεδομένου ότι ο φλοιός δεν υποστηρίζει πράξεις, χρησιμοποιούμε το βοηθητικό πρόγραμμα expr, προκειμένου να τις υπολογίσουμε. Οι πράξεις που υποστηρίζονται με τα αντίστοιχα σύμβολα είναι + Πρόσθεση - Αφαίρεση * Πολλαπλασιασμός / Διαίρεση % Υπόλοιπο διαίρεσης = Απόδοση τιμής == Ισότητα!= Διάφορο
ΥΠΟΛΟΓΙΣΜΟΣ ΕΚΦΡΑΣΕΩΝ (2/3) Παραδείγματα: expr 1 + 1 expr 20 10 expr 5 \* 5 expr 20 / 3 expr 20 % 3 a = $b [ $a == $b ] [ $a!= $b ] Σύνθετα παραδείγματα: expr 8-3 \* 2 2 expr \( 8-3 \) \* 2 10 expr 10 / 3 + 4 7 expr 20 % \( 7 + 2 \)
ΥΠΟΛΟΓΙΣΜΟΣ ΕΚΦΡΑΣΕΩΝ (3/3) Yπάρχουν και οι τελεστές συμβολοσειρών substr, index, length Έστω ότι έχουμε τη συμβολοσειρά "5283username$$2384/" και θέλουμε να πάρουμε την υποσυμβολοσειρά "username". Για να γίνει αυτό πρέπει να διαβάσουμε από τη θέση 5 για μήκος 8. Οι παράμετροι της substr είναι η συμβολοσειρά εισαγωγής, η αρχική θέση και το μήκος. USER=`expr substr $INPUT 5 8` π.χ expr substr transputer 4 5 nsput index String1 String2 Επιστρέφει την πρώτη θέση στο String1 όπου υπάρχει κάποιος χαρακτήρας του String2. π.χ expr index smalltalk btr 6 length String1 Επιστρέφει το μήκος του String1 π.χ expr length systems 7
ΑΣΚΗΣΗ Να γραφεί ένα πρόγραμμα για το κέλυφος που να εκτελεί απλές αριθμητικές πράξεις (πρόσθεση, αφαίρεση, πολλαπλασιασμός, διαίρεση και υπόλοιπο), μεταξύ δύο ακεραίων
ΛΥΣΗ #! /bin/sh # # Usage: math n1 op n2 # case $2 in +) echo "Addition requested." echo "$1 + $3 = `expr $1 + $3`" ;; -) echo "Substraction requested." echo "$1 - $3 = `expr $1 - $3`" ;; \*) echo "Multiplication requested." echo "$1 * $3 = `expr $1 \* $3`" ;; /) echo "Division requested." echo "$1 / $3 = `expr $1 / $3`" ;; %) echo "Modulo arithmetic requested." echo "$1 % $3 = `expr $1 % $3`" ;; *) echo "Unknown operation specified." ;; esac
ΑΣΚΗΣΗ 2 Να γραφεί ένα πρόγραμμα για το κέλυφος που να αντιστρέφει δεδομένες συμβολοσειρές, καθώς επίσης να υπολογίζει και τα μήκη τους
ΛΥΣΗ 2 #! /bin/sh # # Usage: revstrs [string1 [string2...]] # for str do strlen=`expr length "$str"` chind=$strlen while test $chind -gt 0 do echo -n "`expr substr \"$str\" $chind 1`" chind=`expr $chind - 1` done echo -n " --> " echo -n "$strlen" echo " character(s)." done
root@oslab:~$ sudo shutdown h now