La shell di Unix - Dipartimento di Scienze Ambientali, Informatica e

Transcript

La shell di Unix - Dipartimento di Scienze Ambientali, Informatica e
La shell di Unix
Uso interattivo e scripting
Paolo Baldan
[email protected]
Dipartimento di Informatica
Università di Venezia
La shell di Unix – p.1/96
Obiettivi
L’obiettivo di questo ciclo di lezioni è quello di illustrare le funzionalità
principali della shell di U NIX e di tools comunemente presenti nelle
distribuzioni di U NIX.
Uso interattivo della shell
Concetti di base, interazione con la shell, comandi di base, personalizzazione.
Struttura e funzionalità della shell di U NIX (con particolare
riferimento a Linux ed alla Bash shell).
Espansione della riga di comando, ridirezione, comandi composti (liste, pipe, sequenze
condizionali).
Programmazione della shell (shell scripting).
Funzioni, pattern matching, costrutti di controllo, tipi, segnali, debugging.
La shell di Unix – p.2/96
Introduzione a UNIX
(Ripasso)
La shell di Unix – p.3/96
Cos’è UNIX
U NIX è un sistema operativo multiutente e multitasking.
Più utenti possono avere vari tasks/processi che sono eseguiti
contemporaneamente.
U NIX è anche un ambiente di sviluppo software.
È nato ed è stato progettato per questo scopo. (Ad esempio fornisce
utilità di sistema, editor, compilatori, assemblatori, interpreti, . . . )
U NIX è stato appositamente progettato per essere generale e
indipendente dall’hardware (facilmente portabile essendo scritto nel
linguaggio ad alto livello C).
La shell di Unix – p.4/96
Breve storia di UNIX/A
1965: La AT&T, il MIT e la General Electric si uniscono nel
progetto di un s.o. innovativo, che sia multiutente, multitasking,
multiprocessore, con multilevel file system: M ULTICS .
1969: Il progetto M ULTICS “fallisce”.
Presso i Bell Laboratories della AT&T, dalle ceneri di M ULTICS
nasce U NIX , sviluppato da Ken Thompson e Dennis Ritchie del
gruppo Multics per un PDP-7. Anche sulla base dell’ esperienza
M ULTICS, incorpora alcune caratteristiche e supera i limiti di sistemi
operativi preesistenti, supportando, in modo efficiente, multiutenza e
multitasking.
Il nome U NIX (inizialmente Unics) è scelto da Kernighan in
opposizione a M ULTICS.
La shell di Unix – p.5/96
Breve storia di UNIX / C
1973: La terza versione viene scritta nel linguaggio di
programmazione ad alto livello C (anziché in assembler), sviluppato
ai Bell Labs da Dennis Ritchie (come evoluzione di B) proprio per
supportare UNIX.
È un passo importante dato che esisteva la convinzione che solo il
linguaggio Assembly permettesse di ottenere un livello di efficienza
accettabile.
Fine anni ’70: AT&T rende U NIX largamente disponibile, offrendolo
alle Università a basso costo e distribuisce i sorgenti di varie versioni
(costretta da un decreto dell’antitrust che le impone di scegliere tra
telecomunicazioni e informatica).
La shell di Unix – p.6/96
Breve storia di UNIX / D
1984: presso l’Università di Berkeley (California) nasce la Berkeley
Software Distribution (BSD).
versione 4BSD: sviluppata con una sovvenzione del DARPA al
fine di progettare uno standard UNIX per uso governativo.
versione 4.3BSD: sviluppata originariamente per il VAX, è una
delle versioni più influenti. Verrà “portata” su molte altre
piattaforme.
1984: molte caratteristiche della BSD vengono incorporate nella
nuova versione di AT&T: la System V.
Esistono oggi diverse implementazioni di UNIX supportate da molte
case costruttrici di computer: SunOS/Solaris (Sun Microsystems),
Ultrix (DEC), XENIX (Microsoft), AIX (IBM), . . . .
La shell di Unix – p.7/96
Storia di “free” UNIX
1983: Richard Stallmann (MIT) inizia una reimplementazione “free”
di UNIX, detta GNU (acronimo ricorsivo di “GNU is not UNIX”) che
porterà a un editor (emacs), un compilatore (gcc), un debugger
(gdb) e numerosi altri tools.
1991: Linus Torvald (studente ad Helsinki) inizia l’implementazione
di un kernel POSIX compatibile, che prenderà il nome di Linux.
Arricchito con i tools GNU esistenti ed altri sviluppati da volontari,
diviene un sostituto completo di UNIX.
1991: L’ Università di Berkeley rilascia una versione “free” di UNIX,
rimuovendo il codice proprietario rimanente della AT&T. Progetti
volontari continueranno poi il suo sviluppo (FreeBSD, NetBSD,
OpenBSD).
La shell di Unix – p.8/96
Copyleft
Public domain
Il metodo più semplice per produrre “free software” è quello di
renderlo di pubblico dominio, senza copyright.
In questo modo, però, qualcuno può modificare il software e
distribuirlo come un prodotto proprietario.
Copyleft: permette di distribuire un software come free, garantendo
che eventuali versioni modificate ed estese saranno ancora free.
Ogni utente può avere accesso libero al software.
Può avere accesso ai sorgenti, modificare il programma ed
estenderlo.
Può ridistribuirlo, ma con lo stesso tipo di licenza.
La shell di Unix – p.9/96
Filosofia di UNIX
Influenzata da problematiche relative all’HW disponibile all’epoca della
progettazione di UNIX: i dispositivi di I/O erano teletype e più tardi
terminali video con 80 caratteri per linea (ASCII fixed width).
Comandi, sintassi di input e output succinti (per ridurre il tempo di
battitura).
Ogni componente/programma/tool realizza una sola funzione in
modo semplice ed efficiente (UNIX vs. MULTICS). Es. who e sort.
L’output di un programma può diventare l’input di un altro.
Programmi elementari possono essere combinati per eseguire
compiti complessi (Es. who | sort).
Il principale software di interfaccia (la shell) è un normale
programma, sostituibile, senza privilegi speciali.
Supporto per automatizzare attività di routine.
La shell di Unix – p.10/96
Motivi del successo di UNIX
Ha dimensioni relativamente ridotte, un progetto modulare e “pulito”
Indipendenza dall’hardware
Il codice del SO è scritto in C anziché in uno specifico
linguaggio assembler.
UNIX e le applicazioni UNIX possono essere “facilmente”
portate da un sistema hardware ad un altro. Il porting
usualmente consiste nel trasferire il codice sorgente e
ricompilarlo.
È un ambiente produttivo per lo sviluppo del software
Ricco insieme di tool disponibili.
Linguaggio di comandi versatile.
La shell di Unix – p.11/96
Principali caratteristiche di UNIX
Gestione dei Processi
Sono basati sul modello fork / exec
Hanno un’identità ed un possessore, informazioni utilizzate per
protezione e scheduling.
La CPU è gestita in time-sharing, suddividendo il tempo di CPU
in slice (quanti di tempo), assegnate ai processi in base a priorità
(e comportamento passato).
Supporto alla programmazione concorrente e distribuita, tramite
meccanismi di IPC.
Gestione della memoria
basata su paginazione
con varianti, es. buddy system
La shell di Unix – p.12/96
Principali caratteristiche di UNIX/A
File System
Struttura gerarchica grafo radicato (aciclico), in cui file e
processi hanno una propria locazione.
Strumenti per la creazione, modifica e distruzione e protezione
(controllo degli accessi) ai file.
Unix è orientato ai file: Tratta i dispositivi periferici come se
fossero dei file (speciali). Stampanti, terminali ed altri
dispositivi sono accessibili nello stesso modo di file ordinari.
La shell di Unix – p.13/96
Componenti di UNIX
Kernel: nucleo del sistema (gestore di risorse: CPU, memoria,
dispositivi, . . . )
System Call e routine di libreria: facilitano la programmazione,
permettendo di accedere a funzionalità del kernel (manipolazione di
file, gestione di processi concorrenti e comunicazione tra processi).
Shell: interprete di comandi (interfaccia tra l’utente ed il kernel).
Utilities: programmi di utilità (editor, operazioni su file, stampa,
supporto alla programmazione, . . . )
Programmi di utilità
6System call
?
kernel
HW
Shell
Utente
La shell di Unix – p.14/96
Uso interattivo della shell
La shell di Unix – p.15/96
La Shell (informalmente . . . )
Interfaccia (testuale) tramite la quale l’utente interagisce con il
sistema dopo il login.
È un interprete di comandi: legge ciascuna linea di comando, ne
interpreta le diverse componenti e la esegue.
Ogni sistema UNIX mette a disposizione vari tipi di shell. Le shell
più diffuse sono:
Bourne shell (sh), C shell (csh), Korn shell (ksh), TC shell (tcsh),
Bourne Again shell (bash).
Inizialmente, l’amministratore del sistema fornisce all’utente una
shell di default che però può essere cambiata o personalizzata.
Ogni shell fornisce un linguaggio di programmazione. I programmi
di shell, chiamati shell script, sono sequenze di comandi, con
costrutti di controllo, che automatizzano semplici task.
La shell di Unix – p.16/96
Perché usare una shell testuale?
Ormai tutti i sistemi UNIX hanno un’interfaccia grafica. Perché usare i
comandi in linea di una shell testuale?
Potenza e semplicità: I comandi UNIX sono progettati per risolvere
problemi specifici. Sono semplici (senza menù e opzioni nascoste) e
proprio per questo potenti (es. grep parola filename).
Velocità e flessibilità: è più veloce scrivere pochi caratteri da tastiera
piuttosto che cercare un programma opportuno e usare le operazioni
che fornisce sulla base delle proprie specifiche esigenze.
Accessibilità: permette di accedere efficientemente ad un sistema in
remoto.
La shell di Unix – p.17/96
I comandi UNIX
La sintassi tipica dei comandi UNIX (builtin e file eseguibili) è la seguente
comando <opzioni> <argomenti>
Opzioni
Sono opzionali e influiscono sul funzionamento del comando.
Consistono generalmente di un hyphen (-) seguito da una sola lettera
(Es. ls -l). Hanno anche una forma estesa (Es. ls --format
long). Possono avere un argomento (Es. dvips -o p.ps p.dvi).
Spesso più opzioni possono essere raggruppate insieme dopo un solo
hyphen (Es. ls -al).
Argomenti
Si possono avere più argomenti o nessuno.
Alcuni argomenti sono opzionali. Se non specificati assumono valori
di default.
La shell di Unix – p.18/96
I comandi di UNIX - Esempi
nessun argomento: il comando date mostra data e ora corrente.
date
un solo argomento: il comando cd cambia la directory di lavoro
corrente in quella specificata dal suo argomento.
cd mydir
un’opzione ed un argomento: il comando wc conta il numero di
parole/caratteri/righe in un file, in base all’opzione specificata.
wc -w file1
conta le parole in file1
wc -c file1
conta i caratteri in file1
wc -l file1
conta le linee in file1
La shell di Unix – p.19/96
I comandi di UNIX - Esempi / A
numero arbitrario di argomenti: il comando cat concatena e mostra
sullo schermo il contenuto dei file argomento.
cat file1 file2 file3
più opzioni ed un argomento di default:
ls -als
lista dettagliata (l, long) di tutti (a, all) i file, con dimensione
(s, size). L’argomento di default è la directory corrente.
Più comandi, separati da “;” possono essere scritti sulla stessa linea.
cd newdir ; ls -l
I comandi possono essere scritti su più linee usano il carattere
backslash (\). Ad esempio,
cp /users/kelly/recipe kelly.recipe ; \
lpr -Pps3 kelly.recipe
La shell di Unix – p.20/96
Caratteri di controllo
Alcune combinazioni di tasti hanno un effetto particolare sul terminale.
I caratteri di “controllo” sono ottenuti tenendo premuto il tasto Ctrl e
quindi premendo un secondo tasto. Ecco i più comuni:
Ctrl-u
Ctrl-c
Ctrl-h
Ctrl-z
Ctrl-s
Ctrl-q
Ctrl-d
-
erase the command line
stop/kill a command
backspace (usually)
suspend a command
stop the screen from scrolling
continue scrolling
exit an interactive program
(signals end of data)
La shell di Unix – p.21/96
Esempio - Ctrl-d
Il programma cat, senza argomenti, copia l’input (battuto da
tastiera) sull’output (schermo). Es.
/home/rossi$ cat
Questo l’ho scritto io! ← input
Questo l’ho scritto io! ← output
La mancanza del prompt indica che siamo ancora in cat.
Per segnalare a cat (ed a molti altri programmi interattivi) la fine
dell’inserimento dei dati occorre digitare Ctrl-d, detto carattere di
fine-file (End-Of-File o EOF).
Esempio: Provate il programma sort: se inserite un paio di linee e
poi premete Ctrl − d, sort le visualizzerà in ordine alfabetico.
La shell di Unix – p.22/96
Editing della linea di comando
Molte shell, tra cui bash, offrono funzioni di editing della linea di
comando che sono “ereditate” dall’editor emacs. Ecco alcune delle
funzioni più utili:
Ctrl-a
Ctrl-e
Ctrl-k
Ctrl-y
Ctrl-d
-
va a inizio riga
va a fine riga
cancella il resto della linea
reinserisce la stringa cancellata
cancella il carattere sul cursore
La shell, inoltre, registra i comandi inseriti dall’utente. Il comando
history li elenca. Per richiamarli . . .
!! - richiama il comando precedente
!n - richiama la n-ma entry
↑, ↓ - naviga nella history
La shell di Unix – p.23/96
Completamento dei comandi
Un’altra caratteristica di bash è il completamento automatico della linea di
comando con il tasto Tab.
Vediamo un esempio di utilizzo. Supponiamo di essere in questa
situazione.
/home/rossi$ ls
un-file-con-un-nome-molto-lungo
Per copiare il file su corto, anziché digitare per esteso il nome si
può digitare cp un. Quindi premendo il tasto Tab il resto del nome
viene mostrato nella riga di comando e si potrà a questo punto
completare il comando.
Se esistono più completamenti possibili, premendo Tab verrà emesso
un suono. Premendo nuovamente Tab si ottiene la lista di tutti i file
La shell di Unix – p.24/96
che iniziano in quel modo.
Gestione dei files
La shell di Unix – p.25/96
File system
File system: è la struttura che permette la memorizzazione e
l’organizzazione dei dati nel sistema.
È estremamente importante perché UNIX è un sistema orientato ai
file nel senso che molte operazioni vengono effettuate tramite essi
(accesso a periferiche e comunicazione tra processi).
Un nome nel file system può riferirsi a:
file dati (che può anche essere una directory)
dispositivo di input/output (disco, nastro, stampante, . . . )
memoria interna
informazioni sul sistema hardware e software
La shell di Unix – p.26/96
File system / A
Un file può essere visto come una sequenza di byte,
indipendentemente dal tipo di file (file dati, dispositivo, . . . )
Una directory può essere vista come un contenitore di file o di
directory, si ha quindi una struttura gerarchica (ad albero . . . se si
trascurano i link).
/P
Z PP P
J Z
PP
J
P
P
Z
usr
tmp
home
etc
lib
bin
"
dev
D
"
D
"
" lib local
E
bin
E
ttya null passwd group
user1 user2 user3
sh date csh
BB
mail
bin
papers
La shell di Unix – p.27/96
Organizzazione del file system
Per tradizione esistono alcune directory che nel file system assumono un ruolo
particolare.
\
bin
sbin
è la radice della gerarchia;
comandi più importanti del sistema;
comandi che riguardano alcune importanti funzioni di gestione del sistema
(dump, shutdown, ecc.);
dev
etc
lib
mnt
var
dispositivi di input/output che possono essere visti dalla macchina (dischi, nastri, ecc.);
usr
contiene i file non essenziali ma utili (es: le sottodirectory bin con emacs, gzip, ...
X11R6 con il sistema XWindow, man con tutti i manuali, src con tutti i sorgenti);
proc
è un file system virtuale che contiene tutte le informazioni di sistema, dai processi
alla cpu (cpuinfo, version, . . . ).
home
contiene le directory personali di tutti gli utenti.
file di configurazione del sistema (passwd, fstab, lilo.conf, ecc.);
librerie condivise per ridurre la dimensione dei file eseguibili;
mount point dei dispositivi esterni;
contiene file di dimensione variabile (es. in log ci sono i file di log, in spool
ci sono file usati da altri programmi (posta in ingresso, stampe, . . . );
La shell di Unix – p.28/96
Working e Home directory
In UNIX ogni processo ha associata una working directory (directory
di lavoro).
Per conoscere la directory corrente si può utilizzare il comando pwd
$ pwd
/home/rossi
$
Ogni utente “username” ha una home directory — la parte del file
system riservata per suoi file. È indicata con
˜username
Dopo il login, l’utente si trova automaticamente nella propria home
directory, da dove comincia a lavorare.
La shell di Unix – p.29/96
Navigare nel file system - cd
Ci si può spostare all’interno del file system e quindi modificare la
working directory con il comando cd.
cd [<dir>]
Il parametro <dir> è opzionale. Se non viene indicato, il comando
porta nella home directory. Es:
/home/rossi$ cd /bin
/bin$ cd
/home/rossi$
Per la navigazione risultano utili le directory: “.” (working directory)
e “..” (directory padre). Es:.
/home/rossi$ cd ..
/home$ cd .
/home$
La shell di Unix – p.30/96
Pathname
Specifica la locazione di un file all’interno di un file system.
Pathname assoluto: dice come raggiungere un file partendo dalla
radice del file system; comincia sempre con / (slash).
/usr/local/doc/training/sample
Pathname relativo: dice come raggiungere un file a partire dalla
working directory o dalla home directory di un utente.
training/sample
../bin
˜/projects/report
˜rossi/projects/report
Esempio: Per spostarsi da /home/rossi a /home/bianchi:
cd ../bianchi
cd /home/bianchi
- relative pathname
- absolute pathname
La shell di Unix – p.31/96
Visualizzare una directory
Il comando ls permette di visualizzare il contenuto di una (o più)
directory.
ls [-alsFR] [<dir1> ... <dirn>]
Alcune opzioni:
-a
-l
-s
-F
-R
visualizza anche i file nascosti (che iniziano con “.”)
visualizza informazione estesa sui file
visualizza la dimensione
aggiunge un carattere finale al nome che ne denota il tipo:
“/” per directory, “*” per eseguibile, “@” per link,
“=” per socket, nessuno per i file ordinari).
mostra ricorsivamente le sottodirectory
Se non viene specificata nessuna directory, ls si riferisce alla directory
corrente.
La shell di Unix – p.32/96
Creare e rimuovere directory
Tramite i comandi mkdir e rmdir si possono creare e cancellare directory.
mkdir <dir1> [<dir2> ... <dirn>]
rmdir <dir1> [<dir2> ... <dirn>]
Ognuno degli argomenti è considerato una directory da creare/cancellare.
Es.:
/home/rossi$ mkdir report-2000 report-2001
/home/rossi$ ls -F
report-2000/ report-2001/
/home/rossi$ rmdir report-2000 report-2002
rmdir:
report-2002:
No such file or directory
/home/rossi/$ ls -F
report-2001/
Una directory può essere rimossa solo se è vuota:
/home/rossi$ rmdir ..
rmdir:
‘..’: Directory not-empty
La shell di Unix – p.33/96
Copiare, spostare, rimuovere file
Tramite il comando cp si possono copiare file:
cp -i <oldname> <newname>
cp -ir <name1> [<name2> ... <namen>] <destdir>
Prima forma: crea una copia <newname> del file <oldname>. Con l’opzione
“-i” il sistema chiede conferma prima di sovrascrivere un file. Es:
/home/rossi$ ls
chap1
/home/rossi$ cp chap1 chap2; ls
chap1 chap2
Seconda forma: il comando ha più di due argomenti. In questo caso
l’ultimo <destdir> deve essere una directory, dove vengono inseriti i file
<name1> ... <namen>. L’opzione “-r” permette di copiare
ricorsivamente le sottodirectory.
La shell di Unix – p.34/96
Copiare, spostare, rimuovere file / A
Il comando mv per spostare/rinominare file ha sintassi e
funzionamento simile a cp, se non per il fatto che il file originale
scompare
mv -i <oldname> <newname>
mv -i <name1> [<name2> ... <namen>] <dest>
Copia + rimozione? Move tra fs diversi?
Il comando per la cancellazione di file è rm ed ha sintassi
rm -ir <name1> <name2> ... <namen>
Particolarmente interessante l’opzione “-r” che permette di
rimuovere una directory con tutto il corrispondente “sottoalbero”.
La shell di Unix – p.35/96
I Metacaratteri
Accade spesso di voler operare su più file contemporaneamente. Ad es.
supponiamo di voler copiare tutti i file che cominciano con data nella
directory ˜/backup).
UNIX
fornisce un modo molto efficiente per ottenere questo scopo:
/home/rossi/report$ ls -F
data-new
data1
data2
inittab2
pippo
/home/rossi/report$ mkdir ˜/backup
/home/rossi/report$ cp data* ˜/backup
/home/rossi/report$ ls -F ˜/backup
data-new
data1
data2
/home/rossi/report$
(Cosa farebbe cp d*2 ˜/backup?)
La shell di Unix – p.36/96
I Metacaratteri / A
Ecco un elenco dei metacaratteri:
?
ogni carattere
*
ogni stringa di caratteri
[set]
ogni carattere in set
[!set]
ogni carattere non in set
dove set può essere una lista di caratteri (es. [abc]) oppure un intervallo
(es. [a-c]) o una combinazione dei due.
Se la shell trova un’espressione contenente metacaratteri in una linea di
comando, la espande con tutti i nomi di file che “soddisfano” (match)
l’espressione (espansione di percorso).
La shell di Unix – p.37/96
I Metacaratteri / B
Per capire meglio come funziona l’espansione di percorso introduciamo un
nuovo comando, echo. È un comando estremamente semplice: rimanda
sullo schermo ogni parametro.
/home/rossi$ echo Ciao!
Ciao!
/home/rossi$ cd report
/home/rossi/report$ ls -F
data-new
data1
data2
inittab
/home/rossi/report$ echo data*
data-new
data1
data2
/home/rossi/report$ echo data?
data1
data2
/home/rossi/report$ echo [!id]*
pippo
pippo2
/home/rossi/report$
pippo
pippo2
Es. Cosa accade se si esegue cd *?
La shell di Unix – p.38/96
Caratteri speciali
NEWLINE - initiates command execution
; - separates commands on same line
( ) - groups commands or identifies a function
& - executes a command in the background
| - pipe
> - redirects standard output
>> - appends standard output
< - redirects standard input
* - wildcard for any number of characters in a file name
? - wildcard for a single character in a file name
- quotes the following character
’ - quotes a string preventing all substitutions
" - quotes a string allowing variable and command substitution
‘ - performs command substitution
[ ] - denotes a character class in a file name
$ - references a variable
- command grouping within a function
. - executes a command (if at beginning of line)
# - begins a comment
La shell di Unix – p.39/96
: - null command
Accesso ai file
La shell di Unix – p.40/96
Informazioni sui file
Time stamp — Ad ogni file sono associate tre date: cambiamento
attributi, la data di ultima modifica e ultimo accesso.
User (Proprietario) — Ogni file in UNIX è di proprietà di un utente
del sistema.
Group (Gruppo) — Ogni file è associato ad un gruppo di utenti:
quello più comune per i file utente è chiamato users, ed è
generalmente condiviso da tutti gli account utente del sistema.
Permessi — Ad ogni file sono associati dei permessi (chiamati anche
“privilegi”), che specificano chi e in che modo (lettura, modifica,
esecuzione) può accedere a quel file. Ognuno di questi permessi può
essere impostato separatamente per il proprietario, il gruppo e tutti
gli altri utenti (others).
La shell di Unix – p.41/96
Modificare le informazioni sui file
Le informazioni sui file possono essere visualizzate tramite il
comando ls -l. Per esempio
rossi@linuslab:/home/rossi/report
total 2
-rw-r--r-- 1 rossi users
15
-rw-r--r-- 1 rossi users
155
drwxr-xr-x 2 rossi users
1024
> ls -l
Mar 9 12:40 pippo
Mar 9 12:41 pluto
Mar 7 17:33 OLD
In particolare, ogni linea include:
il tipo del file (primo carattere)
i permessi di accesso (caratteri 2-10):
2-4: owner
5-7: group
il proprietario
il gruppo
8-10: other
La shell di Unix – p.42/96
Permessi di accesso
I permessi possono (sostanzialmente) essere:
r = permesso di lettura
w = permesso di scrittura
x = permesso di esecuzione
- = mancanza di permesso
Alcuni esempi
-rw-------rw-r--r--rwxr-xr-x
drwxr-x---
1
1
1
1
rossi
rossi
rossi
rossi
users
users
users
users
3287
13297
4133
1024
Apr
Apr
Apr
Jun
8
8
8
7
12:10
12:11
12:10
10:00
file1
file2
myprog
SCCS
Il permesso x su una directory consente di “attraversarla”.
C’è una forma di dipendenza: per accedere ad un file, oltre ai diritti
necessari per l’operazione desiderata, occorre il permesso x su ogni
directory che compare nel pathname.
La shell di Unix – p.43/96
Cambiare i permessi con chmod
chmod <triads> <filename>*
dove triads sono della forma who action permission
who
action
permission
u
=
user
+
=
aggiunge
r
=
read
g
=
group
-
=
rimuove
w
=
write
o
=
other
=
=
assegna
x
=
execute
a
=
all
=
user
La shell di Unix – p.44/96
Cambiare i permessi con chmod / A
Alcuni esempi:
chmod a+r sample.c
chmod o-r sample.c
chmod og+rx prog*
chmod g=rw rep*
chmod +w *
L’opzione -R cambia (ricorsivamente) i permessi di una directory e
di tutti i file e sottodirectory di quella directory.
La shell di Unix – p.45/96
chmod “numerico”
I permessi di accesso rwx possono essere rappresentati come un
numero ottale. Es. r-x diviene 101 e quindi 58 .
Il permesso r è rappresentato da 4, w da 2 e x da 1. Per ciascuna
categoria di utenti (proprietario, gruppo, altri) questi valori possono
essere sommati. Quindi, si ha
0
1
2
3
=
=
=
=
----x
-w-wx (1+2)
4
5
6
7
=
=
=
=
r-r-x (4+1)
rw- (4+2)
rwx (4+2+1)
I permessi di accesso possono allora essere espressi con 3 cifre ottali.
chmod 640 file1
chmod 754 file1
chmod 664 file1
user
rwrwx
rw-
group
r-r-x
rw-
others
--r-r-La shell di Unix – p.46/96
Stabilire i permessi con umask
umask <mask>
Può essere utilizzato per assegnare i permessi di default.
Tipicamente è usato in uno dei file di startup (per esempio, .login,
.cshrc, .profile) ma può essere usato anche in modo interattivo.
Specifiche ottali (anche simboliche in bash). Diversamente da chmod,
rappresentano i permessi da “mascherare” (cioè, da rimuovere).
Octal number
0
1
2
3
4
5
6
7
Access
rwx
rwr-x
r--wx
-w--x
---
permissions given
read, write and execute
read and write
read and execute
read only
write and execute
write only
execute only
no permissions
La shell di Unix – p.47/96
Stabilire i permessi con umask / A
Il sistema assegna di default i permessi 666 per i file e 777 per le
directory.
Alcuni esempi:
umask 077
Sottrae 077 dai permessi di default del sistema per i file e le
directory. Il risultato è che i permessi di default diventano 600
per i file (rw-------) e 700 (rwx------) per le directory.
umask 002
Sottrae 002 dai permessi di default del sistema per i file e le
directory. Il risultato è che i permessi di default diventano 664
per i file (rw-rw-r--) e 775 (rwxrwxr-x) per le directory.
! umask sottrae i valori passati come parametri sempre ai valori di
default (666 e 777), anche se usato più volte consecutivamente.
La shell di Unix – p.48/96
Cambiare proprietario e gruppo
Per cambiare il proprietario (owner) di un file
chown <new owner> <filename>
Nella maggior parte dei sistemi UNIX, per modificare il proprietario
di un file bisogna essere un super-user (es. l’amministratore del
sistema).
Il proprietario di un file può cambiare il gruppo (group) del file con
un qualsiasi altro gruppo a cui l’utente stesso appartenga.
chgrp <new group> <filename>
Per entrambi i comandi al’opzione -R permette di propagare
ricorsivamente il cambiamento su tutta una directory.
La shell di Unix – p.49/96
Visualizzare i file
La shell di Unix – p.50/96
Mostrare il contenuto di un file
Il comando cat concatena e visualizza sullo schermo (standard
output) il contenuto di uno o più file .
cat [<filename1> ...<filenamen>]
Il comando echo visualizza sullo schermo l’argomento che gli viene
passato (a cui aggiunge un carattere newline, a meno che non si
specifichi l’opzione -n).
echo [-n] <string>
I comandi more, less e pg (potrebbero non essere tutti disponibili)
mostrano il contenuto di un file una schermata alla volta. Inoltre,
permettono di tornare a pagine precedenti, di effettuare ricerche, . . . .
La shell di Unix – p.51/96
Il comando less
Una volta digitato
less <filename>
si può navigare nel file. Ecco alcune opzioni
↑, ↓ scorre su e giù di una riga;
←, → scorre a dx e sx di una schermata;
/<pattern> cerca <pattern> in avanti;
?<pattern> cerca <pattern> indietro;
<n>g va alla riga <n>;
g, G va ad inizio/fine file;
q esce e torna al prompt;
e molte altre (h dà l’help in linea).
La shell di Unix – p.52/96
Mostrare parte di un file
Il comando head mostra le prime 10 linee di un file. Se si usa
l’opzione -n, head mostra le prime n linee.
head [-n] file
Il comando tail mostra le ultime 10 linee di un file. Se si usa
l’opzione -n, tail mostra le ultime n linee.
tail [-n] file
La shell di Unix – p.53/96
Cercare file e comandi
La shell di Unix – p.54/96
Cercare un file
Il comando find permette di cercare un file che soddisfi un dato pattern.
find <pathname> -name <filename> -type <t> -print
dove
pathname indica la directory da cui deve iniziare la ricerca . La
ricerca continuerà in ogni sottodirectory.
<filename> è il nome del file da cercare; può essere anche un
pattern costruito con metacaratteri.
L’opzione -print viene usata per mostrare i risultati della ricerca.
Vediamo alcuni esempi d’uso del comando (con ulteriori opzioni):
find .
-name mtg jan92 -print
find ˜/ -name README -print
find .
-name ’*.ps’ -print
find /usr/local -name gnu -type d -exec ls {} \;
La shell di Unix – p.55/96
Cercare un file / A
Un problema di find è la sua pesantezza computazionale.
Una soluzione è data dal comando locate, che basandosi su di un
database, periodicamente aggiornato (con updatedb), risulta molto più
efficiente
locate <modello>
Elenca i file che nelle basi di dati corrispondono a <modello>.
Esempio:
/home/rossi$ locate astri
/usr/include/g++-3/std/bastring.cc
/usr/include/g++-3/std/bastring.h
/home/rossi$
La shell di Unix – p.56/96
Cercare i programmi
Per cercare la locazione di un programma (tra i sorgenti, tra i file eseguibili
e nelle pagine del manuale in linea):
whereis [-bms] <command>
Alcune opzioni utili sono:
-b
solo file binari
-m
solo pagine dei manuali
-s
solo file sorgenti
Esempio
/home/rossi$ whereis -bms mail
mail:/bin/mail /usr/bin/mail /etc/mail.rc /etc/mail
/home/rossi$
La shell di Unix – p.57/96
Cercare un comando
Accade talvolta di essere a conoscenza dell’esistenza di un comando e di
voler sapere quale file sarà eseguito quando il comando viene invocato.
which <command>
fornisce
il pathname completo del file eseguibile
l’alias corrispondente a <command>
Un comando (builtin nella bash) simile, ma più completo è type
type [-all -path] <command>
indica come la shell interpreta <command>, specificandone la natura (alias,
funzione, file eseguibile, builtin, parola chiave della shell) e la definizione.
Con l’opzione -all vengono fornite tutte le definizioni di <command>,
mentre l’opzione -path restringe la ricerca ai file eseguibili.
La shell di Unix – p.58/96
Gestire archivi
Il comando tar permette di archiviare insiemi di file (in realtà parti del
filesystem, con informazioni sulla gerarchia delle directory) in un unico
file.
tar [-ctvx] [-f <file>.tar] [<directory/file>]
Alcune opzioni comuni sono
-c
-t
-x
-f <file>.tar
-v
crea un archivio
mostra il contenuto di un archivio
estrae da un archivio
specifica il nome del file di archivio
fornisce informazioni durante l’esecuzione
Alcuni esempi
tar -cf logfile.tar mylogs/logs.*
tar -tf logfile.tar
tar -xf logfile.tar
La shell di Unix – p.59/96
Comprimere file
Sono presenti alcuni tool che permettono di ridurre la dimensione di file
con algoritmi di compressione (che sfruttando la ridondanza dei dati danno
risultati migliori su file di testo):
compress [opt] <file>
uncompress [opt] <file>.Z
Ad esempio
compress logs.*
uncompress logfile.tar.Z
Oppure si può usare gzip (Lempel-Ziv coding LZ77) o bzip2
(Burrows-Wheeler block sorting text compression algorithm):
gzip [opt] <file> gunzip [opt] <file>.gz
Ad esempio
gunzip logfile.tar.gz
gzip logs.*
La shell di Unix – p.60/96
Esercizio
Scrivere un comando che crea una sottodirectory della directory corrente,
con nome text-files. Quindi copia in questa directory tutti i file con
estensione txt contenuti nella propria home directory. Se la directory
text-files è già presente rimuove da questa i file il cui nome non inizia
con almeno due caratteri alfanumerico o che non hanno estensione txt.
[Sugg.: Usare la concatenazione di comandi, il comando find e i
metacaratteri.]
La shell di Unix – p.61/96
Comandi di stampa
Alcuni comandi per la stampa dei file e la gestione della coda di stampa
UNIX BSD e Linux
lpr [opt] <filename>
lpq [opt] [<job#>] [<username>]
lprm [opt] [<job#>] [<username>]
Un’opzione usata frequentemente è -P <printername>.
UNIX System V
lp [opt] <filename>
lpstat [opt]
cancel [<requestID>] <printer>
La shell di Unix – p.62/96
Manipolazione di testi
La shell di Unix – p.63/96
Linguaggi formali
Dato un alfabeto A = {a1 , . . . , an }, l’insieme delle stringhe (finite)
sull’alfabeto A è indicato con A∗ , ovvero
A∗ = {s0 . . . sk : si ∈ A}.
Un linguaggio L sull’alfabeto A è un insieme di stringhe su A,
ovvero L ⊆ A∗ .
Operazioni sui linguaggi
Unione:
L + L0 = {α : α ∈ L ∨ α ∈ L0 }
Concatenazione: L · L0 = {αα0 : α ∈ L ∧ α0 ∈ L0 }
Potenza: Ln definito induttivamente
L0 = {}
Ln+1 = L · Ln
S
∗
Stella di Kleene: L = n∈N Ln
La shell di Unix – p.64/96
Linguaggi Regolari
Classificazione dei linguaggi (Noam Chomsky)
Linguaggi
Grammatiche [α → β]
Automi
tipo 0
generali
automi di Turing
tipo 1
monotone / context sensitive
automi limitati linearm.
tipo 2
context-free
automi a pila
tipo 3
regolari
automi a stati finiti
I linguaggi regolari sono molto semplici da trattare (ad es. il
problema dell’appartenenza al linguaggio ha complessità lineare).
b
a
q0
q0
L = {abn : n ≥ 0}
La shell di Unix – p.65/96
Espressioni regolari
Teorema (Kleene) Un linguaggio L sull’alfabeto A è regolare
se e solo se
è ottenibile a dai linguaggi ∅ e {a} con a ∈ A, utilizzando gli operatori di
unione +, concatenazione · e stella (_)∗ .
Espressioni Regolari su di un alfabeto A = {a0 , . . . , an } sono
re := ∅ | a0 | . . . |an | re + re | re · re | re∗
A ciascuna espressione regolare re è associato un linguaggio L(re):
L(∅) = ∅
L(ai ) = {ai }
L(re1 + re2 ) = L(re1 ) + L(re2 )
L(re1 · re2 ) = L(re1 ) · L(re2 )
L(re∗ ) = L(re)∗
Per il teorema di Kleene, ogni linguaggio regolare è denotato da
un’espressione regolare e viceversa.
La shell di Unix – p.66/96
Espressioni Regolari in Unix
Patterns (modelli) che individuano insiemi di stringhe (linguaggi) e
rappresentano uno strumento piuttosto potente e sofisticato di UNIX.
Ispirate alle espressioni regolari della teoria dei linguaggi formali,
ma risultano molto più potenti.
Utilizzate da vari programmi di elaborazione di testi (ad es. grep,
sed, awk, vi, emacs) per:
elencare/eliminare righe che contengono un’espressione
regolare
sostituire un’espressione regolare (~ find/replace)
...
La shell di Unix – p.67/96
Espressioni Regolari in Unix/A
insiemi di caratteri: pattern elementari che specificano la presenza un
carattere appartenente ad un certo insieme.
ancore: legano il pattern a comparire una posizione specifica della
riga (es. inizio, fine).
gruppi: “racchiudono” l’espressione regolare che può quindi essere
riferita come una singola entità.
modificatori: specificano ripetizioni dell’espressione che precede il
modificatore stesso.
La shell di Unix – p.68/96
Espressioni Regolari: Sintassi
[abc]
[a-d]
[ˆset]
.
match any of the characters enclosed
match any character in the enclosed range
match any character not in the following set
match any single character except <newline>
[:alpha:]
[:digit:]
some predefined character sets
\
treat the next char literally. Normally used to
escape special characters such as "." and "*"
Esempi
[ˆ[:alpha:]]
[ˆa-c]
[\.a]
any non alphabetic char (same as [ˆa-zA-Z])
any char except ’a’, ’b’, ’c’
chars ’z’ and ’.’
La shell di Unix – p.69/96
Espressioni Regolari: Sintassi / A
exp1 | exp2
match either exp1 or exp2
exp1 exp2
match exp1 followed by exp2
ˆexp
exp$
exp must start at the beginning of the line
exp must end at the end of the line
Esempi:
a|the
cat
.at
ˆcat
cat$
[cC]at
[0-9]$
either the string ’a’ or the string ’the’
the string ’cat’
any char followed by ’at’, such as ’cat’, ’rat’,
’mat’, ’bat’, ’fat’, ’hat’
’cat’ at the beginning of the line
’cat’ at the end of the line
’cat’ or ’Cat’
any digit ending a line
La shell di Unix – p.70/96
Espressioni regolari: Sintassi / A
exp{n}
exp{n,m}
exp{m,}
exp*
exp+
exp?
match the regular expression exp exactly n times
match exp a minimum of n times and a maximum
of m times
match exp a minimum of n times
(0 <= n,m <= 255)
match exp zero or more times
match exp one or more times
match exp zero or one times
Esempi:
xy*z
any occurrence of an ’x’, followed by zero or
more ’y’s, followed by a ’z’
xy{3,5}z
an ’x’, followed by 3 to 5 ’y’ and then ’z’
[A-Z][A-Z]* one or more upper case letters (same as [A-Z]+)
[A-Z]*
zero or more upper case letters.
La shell di Unix – p.71/96
Espressioni regolari: Sintassi / B
\<exp\>
match exp as long as it is a separate word
(exp)
saves the matching exp in a buffer, for future reference.
Up to nine patterns can be saved for each line.
\n
where n is a digit (1-9). Matches the nth expression
previously saved for this line.
Expressions are numbered starting from the left.
Esempi:
\<cat\>
’cat’ as a separate word (es. ’concatenate’ not ok)
(.*)\1
strings of the kind s s, where s is any string
(not regular nor context-free)
Questa è la sintassi per le espressioni regolari estese accettata da egrep, sed, awk, ma
non da grep (vedere man per ulteriori informazioni).
La shell di Unix – p.72/96
Cercare espressioni regolari
Unix fornisce i comandi grep ed egrep (acronimo per [extended]
generalized regular expression parser) per cercare espressioni regolari
(estese) nei file.
egrep [-ivnwx] <regexpr> [<filename1> ...
<filenamen>]
Il modo più semplice di usarlo è:
egrep <regexpr> <filename>
Esempio:
/home/rossi$ cat ugolino
La bocca sollevo’ dal fiero pasto
quel peccator, forbendola a’capelli
del capo ch’elli avea di retro guasto.
/home/rossi$ egrep pasto ugolino
La bocca sollevo’ dal fiero pasto
La shell di Unix – p.73/96
Cercare espressioni regolari / A
/home/rossi$ egrep ’(p|gu)asto’ ugolino
La bocca sollevo’ dal fiero pasto
del capo ch’elli avea di retro guasto.
/home/rossi$ egrep ’\<d.l\>’ ugolino
La bocca sollevo’ dal fiero pasto
del capo ch’elli avea di retro guasto.
Si osservi che non compare la riga
quel peccator, forbendola a’capelli
/home/rossi$ egrep ’ˆ.a|li$’ ugolino
La bocca sollevo’ dal fiero pasto
quel peccator, forbendola a’capelli
La shell di Unix – p.74/96
Cercare espressioni regolari / B
Alcune opzioni utili di egrep
-i
non distingue tra maiscolo e minuscolo
-n
mostra anche il numero di linea
-v
mostra le linee che non contengono l’espressione
-w
cerca parole intere
-x
cerca linee intere
Se non si specifica <filename>, egrep esamina lo standard input.
Una versione semplificata di egrep è fgrep
fgrep [-ivn] <text> <filename>
è utilizzato per cercare stringhe in file di tipo testo. Le opzioni -i, -n
e -v funzionano come per egrep.
La shell di Unix – p.75/96
Sostituire caratteri
Il comando tr converte un testo, carattere per carattere, secondo una
corrispondenza specificata.
tr ’<sourceCh>’ ’<destCh>’ < <file>
Esempio:
/home/rossi$ tr ’aeiuo’ ’eiuoa’ < ugolino
Le bacce salliva’ del fuira pesta
qoil piccetar, farbindale e’cepillu ...
trasforma a → e, . . . , o → a.
Se ’<destCh>’ è più corto di ’<sourceCh>’, si usa l’ultimo carattere in
’<destCh>’.
Opzioni
-c
-s
-d
trasforma i caratteri non in ’<sourceCh>’ (complement)
elimina caratteri uguali vicini (squeeze)
cancella i caratteri in ’<sourceCh>’ (delete)
La shell di Unix – p.76/96
Sostituire caratteri / A
Esempi:
trasforma tutti i caratteri maiuscoli in minuscoli
tr ’A-Z’ ’a-z’ < filename
semplice encryption (a → b, b → c . . . , z → a)
tr ’a-zA-Z’ ’b-zA-Za’ < filename
rimuove tutte le cifre dall’input
tr -d ’0-9’ < filename
scompone l’input in parole, sistemandole una per riga
tr -cs ’a-zA-Z0-9’ ’\n’ < filename
La shell di Unix – p.77/96
sed - editor di stream
Il comando sed permette di scandire uno o più file, modificando le linee
che soddisfano una particolare condizione (nello stile dell’editor vi).
sed -e ’<edit commands>’ <filename>
sed -f <edit command file> <filename>
Nel primo caso le azioni da eseguire sono inserite nella linea di comando,
nel secondo caso in un file, ed hanno forma <selettore><comando>.
Alcuni comandi di Editing
p
stampa la linea corrente
d
cancella la linea corrente
s/RegExp/Repl/
sostituisce la prima occorrenza di RegExp con Repl.
s/RegExp/Repl/g
sostituisce ogni occorrenza di RegExp con Repl.
La shell di Unix – p.78/96
sed - editor di stream / A
I comandi di editing possono essere qualificati con un pattern che
seleziona le linee alle quali tali comandi devono essere applicati.
Alcuni selettori di Linea
n
linea numero n
n,m
le linee dal numero n ad m
/RegExp/
le linee che corrispondono a RegExp
/RegExp1/,/RegExp2/
tutte le linee tra ogni occorrenza di RegExp1
e la successiva occorrenza di RegExp2
Un’opzione interessante è
-n
sopprime ogni linea non esplicitamente selezionata (si ricordi che, altrimenti, sed copia in output ogni linea, possibilmente modificata).
La shell di Unix – p.79/96
sed - editor di stream / B
Rimuove tutte le linee che contengono la stringa guasto
sed -e ’/guasto/d’ ugolino
Stampa solo le prime dieci linee di un file (simile a head)
sed -n -e ’1,10p’ ugolino
Mostra il file delle password, fornendo solo le linee da root a
nobody, ovvero gli account di sistema.
sed -n -e ’/ ˆ root/,/ ˆ nobody/p’ /etc/passwd
Aggiunge due spazi all’ inizio di ogni riga.
sed -e ’s/ ˆ / /’ filename
Elimina l’indentazione in un file, ovvero elimina tutti gli spazi ad
inizio riga.
sed -e ’s/ ˆ *//’ filename
La shell di Unix – p.80/96
sed - Esercizi
Scrivere un comando sed che
visualizzi un file, cancellando le linee da 3 a 5.
visualizzi solo la parte di un file che inizia alla prima linea che
contiene “start” e finisce alla prima linea che contiene “stop”.
visualizzi solo le linee non vuote di un file (cioè le linee che
contengono almeno un carattere).
visualizzi solo le linee non vuote e non costituite di soli spazi.
dato un file lo visualizzi sostituendo ogni linea contenente la parola
bomba con OMISSIS.
dato un file con riferimenti bibliografici del tipo “si veda [Kant12],
visualizzi solo i riferimenti, uno per riga.
La shell di Unix – p.81/96
Manipolare testi con awk
awk è un utility per la manipolazione di testi, il cui nome deriva dalle
iniziali degli autori (Aho, Weinberger, Kerningham)
La sintassi, nelle forme più semplici, è la seguente:
awk ’<programma>’ <file>
awk -f <progfile> <file>
scorre un file (o più) ed esegue alcune azioni sulle linee che
soddisfano una data condizione, concordemente con quanto
specificato nel programma.
La sintassi dei programmi è simile a quella del linguaggio C.
Si tratta di un’utility estremamente flessibile e potente. Qui ci
limiteremo a vedere solo alcuni esempi (→ Perl).
La shell di Unix – p.82/96
Manipolare testi con awk - campi
Ogni linea di testo letta viene scomposta in campi (i separatori di
campo di default sono <space> e <tab>).
Il primo campo di una linea può essere riferito con $1, il secondo
con $2, .... L’intera linea è riferita da $0. Il numero di campi è
riferito dalla variabile predefinita NF.
Ad esempio
awk ’{print NF,$0}’ pippo
mostra il file pippo sullo schermo premettendo ad ogni linea il
numero NF di campi (parole) che la compongono.
La shell di Unix – p.83/96
Manipolare testi con awk - script
Un programma awk è costituito da una o più linee della forma
[ <condizione> ]
{ <azione> }
<condizione> può essere
un’espressione che coinvolge operatori logici e relazionali,
oppure espressioni regolari.
uno dei token speciali BEGIN e END, che risultano attivati
all’inizio del file (prima della prima linea) ed alla fine del file
(dopo l’ultima linea)
<azione> è un insieme di istruzioni C-like.
La shell di Unix – p.84/96
Manipolare testi con awk - script / A
L’elenco di istruzioni C-like può contenere, ad esempio:
if (conditional) statement [ else statement]
while (conditional) statement
for (expr; conditional; expr) statement
for (var in array) statement
break
continue
variable = expression
print list-of-expressions
printf format list-of-expressions
statement; statement
{ statement }
La shell di Unix – p.85/96
Manipolare testi con awk - script / B
Il programma awk viene eseguito secondo i passi seguenti:
il testo viene analizzato linea per linea e per ogni regola del tipo
[ <condizione> ] { <azione> }
si valuta <condizione> e se questa è vera viene eseguita
<azione>
se <condizione> è assente allora <azione> viene eseguita in
ogni caso.
se <azione> è assente allora la riga corrente è stampata
immutata.
La shell di Unix – p.86/96
Manipolare testi con awk - script / C
Si supponga che il file wordcount.awk contenga
BEGIN { print ‘‘Inizio ad elaborare il file ...’’ }
{ for (i = 1; i <= NF; i++)
num[$i]++
}
END { for (word in num)
print word, num[word];
print ‘‘Fine del file:’’, FILENAME
}
allora il comando
awk -f wordcount.awk file
restituisce la lista delle parole che compaiono nel file file e la loro
frequenza (word in num permette di scorrere gli indici di un array).
La shell di Unix – p.87/96
Manipolare testi con awk - variabili
awk supporta variabili definite dall’utente;
le variabili non devono essere dichiarate (tipico dei linguaggi di
scripting);
inizialmente ogni variabile ha valore null o 0
File: lfcount.awk
BEGIN { print ‘‘Inizio ad elaborare il file ...’’ }
NF == 5 {
printf ‘‘Linea %d: %s \n’’, NR, $0;
lineCount++;
wordCount += NF;
}
END { printf ‘‘Linee: %d, Campi: %d’’, lineCount, wordCount) }
Seleziona le linee che contengono 5 campi, le visualizza con il numero di
riga, ne conta il numero ed il numero dei campi e lo visualizza.
La shell di Unix – p.88/96
Manipolare testi con awk - regexp
La condizione può essere
un’espressione regolare (estesa):
/RegExp/
valida per ogni riga che corrisponda all’espressione;
una coppia di espressioni regolari
/RegExp1/, /RegExp2/
in questo caso l’azione <action> si applica ad ogni linea tra la prima
che corrisponde a /RegExp1/ e la linea successiva a questa che
corrisponde a /RegExp2/.
Esempio:
awk ’/start/, /stop/ { printf ‘‘line %d: %s’’, NR, $0}’
filename
La shell di Unix – p.89/96
awk - pattern matching
Potenti funzioni di pattern matching su espressioni regolari:
Condizioni: str ˜exp oppure str !˜exp
Esempi:
‘‘abbc’’
/a[b]+c/: ok
‘‘ac’’
/a[b]+c/: no
Operatori su stringhe:
gensub(exp, str, h [, target]):
Sostituisce la prima/tutte le occorrenze di exp in target con
str (a seconda del valore di t). Quando target è assente usa
$0. La stringa str può contenere \n.
split(str, array [, exp]):
Suddivide la stringa str e mette i frammenti in un array. Usa
come separatore exp (default FS)
La shell di Unix – p.90/96
Manipolare testi con awk - esercizi
Data un agenda con righe:
<cognome, nome, indirizzo, città, numero>
scrivere un programma awk per stampare le righe con nome uguale a
Giovanni e città uguale a Milano.
Scrivere un programma awk che stampi le righe di un file dall’ultima
alla prima.
scrivere un programma awk per sostituire in un testo la parola
sempre con la parola mai e contare le sostituzioni effettuate.
Scrivere un programma awk che spezzi una riga subito dopo il 20mo
carattere, appenda uno come avvertimento e scriva a capo il resto
della riga, giustificato a destra (la funzione substr(str,i,j)
fornisce la sottostringa di str dall’indice i all’indice j).
La shell di Unix – p.91/96
Eliminare doppioni
L’utility uniq permette di modificare un file, sostituendo righe identiche
adiacenti con un’unica occorrenza della riga ripetuta.
uniq [-c] <infile> <outfile>
Con l’opzione -c ogni riga è preceduta dal numero di occorrenze.
/home/rossi$ cat uniqfile
questa e’ una riga doppia
questa e’ una riga doppia
questa e’ una riga singola
questa e’ una riga tripla
questa e’ una riga tripla
questa e’ una riga tripla
/home/rossi$ uniq
2 questa e’ una
1 questa e’ una
3 questa e’ una
-c uniqfile
riga doppia
riga singola
riga tripla
La shell di Unix – p.92/96
Confrontare due file
Due utility permettono di confrontare file:
cmp <file1> <file2>
Verifica l’uguaglianza di <file1> e <file2> e
nel caso siano diversi fornisce la riga e l’offset (numero di byte
dall’inizio del file) del primo mismatch
se uno è un prefisso dell’altro si ottiene un messaggio di EOF
sul file più corto.
diff <file1> <file2>
Simile a cmp, ma fornisce una lista di differenze tra i due files
(cambiamenti necessari per convertire il primo file nel secondo).
La shell di Unix – p.93/96
Un sommario dei comandi visti
awk
cat
cd
chgrp
chmod
cmp
chown
compress
cp
date
diff
file
find
grep
gzip
head
lp
lpr
-
search for and process patterns in a file,
display, or join, files
change working directory
change the group associated to a file
change the access mode of a file
compare files
change the owner of a file
compress files
copy files
view/set the date of the system
show differences between files
display file classification
find files
search for a pattern in files (egrep, fgrep)
compress files
display the first few lines of a file
print files (System V)
print files (Berkeley)
La shell di Unix – p.94/96
Un sommario dei comandi visti / A
lprm
ls
mkdir
more
mv
pwd
rm
rmdir
sed
sort
tail
tar
tr
umask
uniq
wc
whereis
which
-
remove a job from the print queue
list information about files
create a directory
display a file one screen at a time (System V)
move and/or rename a file
print the working directory
remove (delete) files
remove (delete) a directory
stream editor
sort and/or merge files
display the last few lines of a file
store or retrieve files from an archive file
transliterate charaters
set file creation permissions
remove duplicates
counts lines, words and characters in a file
show where executable is located in path
locate an executable program using "PATH"
La shell di Unix – p.95/96
Altri comandi
df
du
fsck
groups
ln
spell
split
cut
paste
whatis
-
display the amount of available disk space
display information on disk usage
check and repair a file system
show user groups
create a link to a file
check a file for spelling errors
split files
cut columns from a file
join coulumns in a single file
list man page entries for a command
La shell di Unix – p.96/96