Comandi avanzati Salvatore Campagna Email: [email protected] Politecnico di Torino Dipartimento di Automatica e Informatica Il comando find Il comando find cerca file in una gerarchia di directory Sintassi: find <directory> <espressione> ◦ <espressione> è un insieme di opzioni, test e azioni ◦ Le opzioni hanno effetto su tutti i file globalmente ◦ I test e le azioni sono eseguiti file per file Il comando find Le opzioni più importanti sono: ◦ -name <pattern>: seleziona i file con nome che soddisfa il pattern specificato ◦ -perm <mask>: seleziona i file con determinati permessi (rappresentazione ottale) ◦ -size <[+|-]n[ckM]>: selziona i file di dimensione n ◦ -type <type>: seleziona i file in base al tipo. type=d directory, type=f file, type=l link ◦ -user <user>: seleziona i file dell’utente specificato Il comando find -links <n>: seleziona i file con n link -ls: produce un formato simile al formato esteso di ls -maxdepth <n>: scende ricorsivamente nelle directory al massimo fino al livello n (rispetto al corrente livello) -mindepth <n>: scende ricorsivamente nelle directory almeno fino al livello n (rispetto al corrente) Il comando find Esempi: ◦ ◦ ◦ ◦ ◦ ◦ ◦ find find –ls find /home –name ‘’test’’ find . –size +10k find /usr/bin –perm 444 –u alice find –type d find –maxdepth 1 –mindepth 1 Il comando find L’opzione –exec permette di eseguire una certa azione su tutti i file selezionati da find Sintassi: find <dir> <opzioni> -exec comando argomenti ‘{ }’ \; ◦ comando è un comando eseguito su ciascun file ◦ argomenti sono gli argomenti da passare al comando ◦ ‘{}’ viene sostituito da file selezionati in modo che il comando operi su di essi ◦ ; segnala la fine dei parametri per l’opzione exec Il comando find Esempi ◦ find . -type f -exec file {} \; ◦ find . –perm 664 –exec chmod u+x ‘{ }’ \; ◦ find . –type f –name “*.bak” –exec mv ‘{ }’ backup/ \; Gestione dei processi Quando viene impartito un comando la shell lancia il processo che lo esegue e attende la sua terminazione E’ possibile avviare o fermare l’esecuzione di un processo e in più sospendere e riprendere Si possono eseguire più processi concorrenti lanciandoli in background Sintassi: comando & Gestione dei processi I processi si possono sospendere con la combinazione CTRL-Z (sospendere non vuol dire terminare) Il comando fg [jobid] porta in foreground il comando rendendolo il comando corrente Il comando bg [jobid] mette il comando in background come se fosse stato avviato con ‘&’ Gestione dei processi comando shell RUN foreground comando & ctrl-z fg fg STOPPED bg RUN background Gestione dei processi jobs: elenca i job bg %<jobid>: porta in background il job identificato da jobid fg %<jobid>: porta in foreground il job identificato da jobid kill -9 <jobpid>: invia un segnale che termina il processo con pid specificato ps: elenca i processi con i relativi dettagli Makefile Obiettivo: dato un insieme di file sorgente determinare se e quali file devono essere ricompilati per generare un file oggetto/exeguibile I makefile descrivono i legami tra file (dipendenze) e riportano i comandi da eseguire per aggiornare gli eseguibili Utilizza la data di ultima modifica per decidere se ricompilare un eseguibile Makefile Esempio: 1. main.o: main.c main.h <TAB>gcc –c main.c –o main.o 2. main.exe: main.o <TAB>gcc main.o –o main.exe 3. clean: <TAB>rm –rf *.o $(EXEC) Makefile E’possibile dichiarare variabili Esempi: ◦ ◦ ◦ ◦ CC=gcc CFLAGS=-Wall SRCS=main.c mylib.c HEADERS=main.h mylib.h E scrivere poi: main.exe: $(SRCS) $(HEADERS) <TAB>$(CC) $(CFLAGS) $(SRCS) –o main.exe Makefile Se il file si chiama GNUMakefile o makefile oppure Makefile basta invocare make Altriemnti make –f <makefile> Si può specificare un target lanciando make <target> ◦ Esempio: make main.o per eseguire solamente il comando associato al target main.o Occupazione di spazio su disco I comandi df e du permettono di ottenere informazioni riguardo l’occupazione di spazio su disco Spazio libero: df [-k] [disco] ◦ -k: spazio in Kbyte Spazio occupato: du [-aks] <directory> ◦ -a: occupazione per file ◦ -s: solo occupazione totale ◦ -k: occupazione in Kbyte Cut Cut divide ogni riga di un file in più campi cut [opzioni] [file] Opzioni utili ◦ -f num: specifica il numero di campo da scrivere su standard output ◦ -d delim: usa il delimitatore specificato per separare i vari campi Esempio: cut –f2 –d: Uniq Elimina occorrenze adiacenti e ripetute di una riga di file Senza opzioni le righe ripetute vengono «collassate» in una sola riga uniq [opzioni] [file] Opzioni utili: ◦ ◦ ◦ ◦ ◦ -c: precede ogni riga col numero di occorrenze -d: visualizza solo righe ripetute -f num: evita il confronto dei primi num campi -i: ignora maiuscole e minuscole -u: visualizza solo righe uniche Sort Visualizza il risultato dell’ordinamento dei file passati come argomento sort [opzioni] [file] Opzioni utili: ◦ -d: ordinamento ‘dizionario’ (considera solo spazi e caratteri alfanumerici) ◦ -f: ignora maiuscole e minuscole ◦ -M: ordinamento mensile ◦ -n: ordinamento numerico ◦ -R: ordinamento random ◦ -r: inverte l’ordinamento ◦ -kPOS1,POS2: ordina in base al campo individuato da POS1 e POS2 ◦ -d delim: specifica il separatore di campo Sort Esempio: ◦ sort –k3 –d: -r –M testfile.txt ◦ divide ogni riga del file testfile.txt in campi separati da ‘:’ e opera un ordinamento menisle (-M) invertito (-r) sul campo numero 3 (-k=3) Espressioni regolari Utilizzate per individuare testo con un certo criterio Esempio: tutte le righe che comniciano con un certo carattere o che contengono una certa parola Utilizzano dei caratteri speciali per individuare il testo Espressioni regolari Caratteri speciali ◦ ◦ ◦ ◦ ‘^’ match dell’inizio di una riga di testo ‘$’ match dellla fine di una riga di testo ‘.’ match di un singolo carattere (qualsiasi) ‘*’ match zero o più occorrenze del carattere precedente ◦ ‘[]’ match di tutti i caratteri al suo interno Espressioni regolari Si specificano tra // Esempi: ◦ ◦ ◦ ◦ /./: match righe con almeno un carattere /a.*b/: match di ‘ab’, ‘acb’, ‘abdfb’, ecc... /^#/: match righe che cominciano con ‘#’ /} *$/: match delle righe che terminano con una parentesi seguita da zero o più spazi ◦ /[a-z]*/: match di una parola con caratteri minuscoli ◦ /[Ss]istemi/: match di ‘Sistemi’ oppure ‘sistemi’ ◦ /[1-9][0-9]*/: match di un numero decimale Grep Grep visualizza le righe di un file che rispettano (match) un certo formato (pattern) grep [opzioni] pattern [file] Il pattern può essere una espressione regolare Grep Opzioni utili ◦ ◦ ◦ ◦ ◦ ◦ -c: stampa il numero di righe con un match -f file: legge il pattern da cercare da file -h: elimina il nome del file in cui si ha il match -H: visualizza il nome del file per ogni match -i: ignora maiuscole/minuscole -n: precedi ogni linea di output con il numero di riga in cui si ha il match ◦ -v: seleziona le righe che NON soddisfano al ricerca ◦ -r: opera ricorsivamente su tutti i file Scripting Uno script è costituito da un file contenente un insieme di comandi La prima riga ha un formato particolare e istruisce la shell sull’interprete da utilizzare per eseguire i comandi ◦ #!/bin/bash ◦ #!/bin/csh ◦ ecc... Si deve impostare il permesso di esecuzione Scripting – If e test Il costrutto if/then/else test l’exit status di un comando Formato If [ condizione-vera ] then <comando> else <comando> fi Scripting – If e test Le parentesi [ ] (sinonimo del comando test) considerano il comando un confronto o un test su file Esempio If [ $var = ‘’user’’] then echo ‘’Alice è un utente del sistema’’ fi Scripting – If e test If [ -e file ]: testa l’esistenza di un file If [ -s file ]: testa se un file ha dimensione maggiore di zero If [ -d directory ]: testa l’esistenza di una directory If [ -h link ]: testa se link è un link Scripting – If e test Per confrontare variabili con valori interi si usano speciali operatori: ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ If [ $var –eq 0 ]: test var == 0 If [ $var –lt 0 ]: test var < 0 If [ $var –gt 0 ]: test var > 0 If [ $var –le ]: test var <= 0 If [ $var –ge ]: test var >= 0 If [ $user == ‘’alice’’ ]: test uguaglianza tra stringhe If [ $user != ‘’alice’’ ]: test disuguaglianza If [ ‘’a’’ > ‘’b’’ ] oppure [ ‘’a’’ < ‘’b’’ ]: test precedenza alfabetica ◦ If [ -n $user ]: test user non è null Scripting – If e test Si possono concatenare i test con operatori logici per eseguire più test -a: and -o: or Esempio: il file esiste e ha dimensione maggiore di zero If [ -e file –a –s file ] then ... fi Scripting – Ciclo for Ciclo for for arg in list do <comandi> done Esempio: for name in ‘’alice’’ ‘’bob’’ ‘’mike’’ do echo $name done Scripting – Ciclo while Il ciclo while while [ condizione ] do <comandi> done Esempio var=0 while [ $var –lt 10 ] do echo $var done Scripting Esempio 1: si realizzi uno script che dati in input una o più directory verifichi l’esistenza di link orfani in ciascuna delle directory Esempio 2: si realizzi uno script che visualizzi su standard output l’elenco di tutti gli utenti esistenti sul sistema Sed Sed è un filtro (stream editor) Opera trasformazioni sul testo letto da stdin riga per riga e scrive l’output su stdout Sintassi: sed [opzioni] ‘[comandi]’ [file] Opzioni utili: ◦ -f <script>: esegue i comandi sed contenuti nel file ◦ -n: se specificato visualizza le righe richieste col comando p (vedi slide seguenti) Sed Ogni comando sed è composto da un address e una istruzione Sintassi comando: <address><istruzione> Sed opera riga per riga applicando l’istruzione ad ogni porzione di testo individuata dall’address La riga corrente durante l’esecuzione di un comando sed prende il nome di pattern space Sed Numero di address 1. 0: se non si specifica l’address sed esegue l’istruzione su ciascuna riga 2. 1: se si specifica un address sed opera sulle righe individuate dall’address 3. 2: se si specificano due address sed opera su tutte le righe comprese tra i due address Sed Come si specificano gli address ◦ Con un range. Esempio: 1,10. Tutte le righe dalla 1 alla 10. ◦ Espressione regolare. L’istruzione opera sulle righe che soddisfano l’espressione regolare (specificata tra ‘//’) ◦ Con $. L’istruzione opera sull’ultima riga ◦ Con un numero. Il numero è interpretato come numero di riga su cui eseguire l’istruzione ◦ num~step: a partire dalla riga num ogni step righe. Esempio: 1~3 dalla prima riga ogni 3 Sed Istruzioni diverse a seconda del numero di address: ◦ 0 oppure 1 address: =: stampa il numero di riga q: termina l’elaborazione ◦ Esempi: cat Makefile | sed ‘=‘ (stampa numero riga) Sed ◦ 1 oppure 2 address: d: cancella la riga (1 address) o il testo compreso (2 address) p: stampa il pattern space (riga corrente su cui opera il comando) s/regexp/replacement/flag: sostituisce regexp con replacement flag: numero, p oppure g y/charset1/charset2/: sostituisce i caratteri in charset1 con i correspondenti caratteri in charset2 Sed Esempi: cat Makefile | sed ‘/^#/d’ (cancella i commenti) cat Makefile | sed –n ‘3,$p’ (visualizza le righe dalla terza alla fine del file) cat Makefile | sed ‘s/main/prog/g’ (sostituisce tutte le occorrenze di main con prog) cat Makefile | sed ‘y/m/M/’ (sostituisce tutte le occorrenze di ‘m’ com ‘M’) cat Makefile | sed ‘/^clean/,$ s/rm/rm -i/g’ (sostituisce tutte le occorrenze di rm con rm –i a partire dalla rig che comincia con clean fino alla fine del file) Sed Esercizio 1: Scrivere un comando sed che legga da stdin un numero esadecimale (preceduto da 0x) e visualizzi in output il numero binario corrispondente Esercizio 2: Cosa fa il seguente comando? ◦ sed '/g/s/g/s/g‘ Esercizio 3: scrivere un comando sed che chiamato su un file C contenente la funzione main ne visualizzi il contenuto (solo della funzione main)