Comments
Description
Transcript
esercizi sed, awk e scripting
Lab. di Sistemi Operativi - Esercitazione n° 3- “Script shell Sed & Awk” 1 Sommario Comandi di ricerca: Sed (Stream Editor) Selezione di un range di righe Ricerca e sostituzione Awk Comando kill Script shell con: Ciclo for If then Ciclo While 2 Esercizio n° 1 1) Utilizzando il comando sed, stampare a video le prime (e ultime) cinque righe del file /etc/passwd Suggerimento: sed ‘[add1,[add2]]com’ (selezione di un range di righe) 3 Soluzione Esercizio n° 1 estremi dell’intervallo di applicazione del comando sed > sed `6,$d` /etc/passwd d è il comando di cancellazione. In questo caso incomincia ad eliminare tutte le righe a partire dalla sesta fino all’ultima riga contenuta nel file ($ sta per ultima riga del file) 4 Esercizio n° 2 Supponendo di avere un file gruppiLSO.txt con la lista dei gruppi e dei relativi punteggi formattato usando “;” come separatore di campo: file gruppiLSO.txt: NomeGruppo;Punteggio;matricola1;...;matricolaN Lso01InfoNa03;69,00;566100; ...; 566101 lso01InfoNa08;70,00;566300; ...; 566504 lso01InfoNa21;65,33;566500; ...; 566601 Lso01InfoNa15;63,56;566600; ...; 566432 …………………………;………;.........;............ …………………………;………;.........;............ 5 Esercizio n° 2 Sostituire utilizzando il comando sed tutti i separatori di campo “;” con caratteri di spazio “ “ in modo tale da avere il seguente output: file gruppiLSO.txt NomeGruppo Punteggio lso01InfoNa03 69,00 lso01InfoNa08 70,00 lso01InfoNa21 65,33 lso01InfoNa15 63,56 ………………………… ………… ………………………… ………… 6 Soluzione Esercizio n° 2 Utilizzo delle quattro parti del comando sostituzione (s) sed ‘s/regexp/replacement/flags’ <nome_file> Applicazione: > sed ‘s/;/ /g’ gruppiLSO.txt oppure > cat gruppiLSO.txt | sed ‘s/;/ /g’ flag g: applica la sostituzione con il carattere di spazio a tutte le occorenze “;” 7 Esercizio n° 2 1) Utilizzando il comando sed, nel file file /etc/passwd per tutti gli utenti che usano bash sostituire il contenuto del campo di password con ' password' 8 Esercizio n° 2 2) sed '/bash/s/:x:/:password:/g' /etc/passwd 9 Esercizio n° 2 Nel file gruppiLSO.txt sostituire utilizzando il comando sed tutti i separatori di campo “;” con caratteri di spazio “ “ e commentare con # tutti i gruppi che contengono matricole 566-xxx 10 Esercizio n° 2 2) sed -e '/566/s/^/#/g' -e 's/:/ /g' gruppiLSO.txt 11 Esercizio n° 3 Applicare la lista dei gruppi ottenuta nell’ Esercizio N° 2 , al comando awk che con il comando sort deve produrre in output una lista dei gruppi in ordine decrescente di punteggio: Output: Punteggio NomeGruppo 70,00 lso01InfoNa08 69,00 lso01InfoNa03 65,33 lso01InfoNa21 63,56 lso01InfoNa15 12 Soluzione Esercizio n° 3 > cat gruppiLSO.txt | sed –e ‘s/;/ /g’ | awk '{print $2 " " $1}' | sort -nr outp ut 69,00 lso01InfoNa03 lso01InfoNa03 69,00 lso01InfoNa08 70,00 lso01InfoNa21 65,33 input awk '{print $2 " " $1}' output 70,00 lso01InfoNa08 65,33 lso01InfoNa21 63,56 lso01InfoNa15 lso01InfoNa15 63,56 inpu t sort -nr outp ut 70,00 lso01InfoNa08 69,00 lso01InfoNa03 65,33 lso01InfoNa21 63,56 lso01InfoNa15 13 Esercizio n° 4 Ripetere l’ Esercizio N° 3 senza utilizzare il comando sed (solo awk e sort ) partendo quindi da un file gruppiLSO.txt avente il seguente contenuto: file gruppiLSO.txt: NomeGroup; Punteggio lso01InfoNa03;69,00 lso01InfoNa08;70,00 lso01InfoNa21;65,33 lso01InfoNa15;63,56 …………………………;………… …………………………;………… 14 Soluzione Esercizio n° 4 > awk –F’;’ '{print $2 " " $1}' gruppiLSO.txt | sort -nr outp ut 70,00 lso01InfoNa08 69,00 lso01InfoNa03 70,00 lso01InfoNa08 65,33 lso01InfoNa21 63,56 lso01InfoNa15 input sort -nr output 69,00 lso01InfoNa03 65,33 lso01InfoNa21 63,56 lso01InfoNa15 15 Esercizio n° 5 Facendo uso del comando awk, elencare gli utenti diversi che usano “bash” come shell di default presenti nel file /etc/passwd Nota: esercizio proposto la scorsa esercitazione e risolto con l’ utilizzo del comando grep 16 Soluzione Esercizio n° 5 (awk) Visualizza il /etc/passwd contenuto del file confronto il settimo elemento di ogni record cat /etc/passwd | awk 'BEGIN { FS=":" } ($7 == “/bin/bash”) { print $1 }' pattern BEGIN serve a specificare un'eventuale inizializzazione del programma che deve essere eseguita prima di cominciare ad elaborare i dati. In questo esempio la variabile FS è settata con la stringa ":" in modo che le righe di /etc/passwd vengono suddivise correttamente nei campi corrispondenti stampa l’utente La suddivisione del record in campi avviene automaticamente utilizzando il valore della variabile FS (Field Separator) 17 Esercizio n° 5 Facendo uso del comando awk, elencare tutti i pid e gli username dei processi con CPU% maggiore di 0.05. Stampare quindi l'utilizzo totale di CPU da parte di tali processi 18 Esercizio n° 5 ps -aux | awk ' { if($3 > 0.05) { print $3 ; tot +=$3} } END { print “totale:” tot}' 19 Esercizio n° 6 Scrivere uno script shell di nome controlla che come argomento di input riceve nomefile (nome del file da controllare). Lo script deve verificare ogni 10 secondi se il file nomefile esiste nella directory corrente, e notifica con un messaggio quando il file viene creato. Successivamente al lancio dello script shell, usare il comando kill per uccidere il processo in esecuzione. Esempio di lancio: > ./controlla.sh <nome_file> & Il processo è lanciato in background 20 Soluzione Esercizio n° 6 Soluzione: Entra nel ciclo se il file passato come parametro esiste ed è un file regolare #! /bin/bash until [ -f $1 ]; do sleep 10; La notifica dell’esistenza del file viene data secondi ogni 10 done echo "Il file $1 esiste" Messaggio di notifica 21 Soluzione Esercizio n° 6 Eliminazione del processo in background controlla.sh : Utilizzo del comando kill: È necessario conoscere l’ identificatico univoco del processo (ID) detto PID Utilizzo del comando ps che consente di visualizzare la lista dei processi attivi con le seguenti informazioni: PID PPID PGID WINPID TTY UID STIME COMMAND Ciò che interessa è il numero sotto la colonna PID corrispondente al processo da uccidere. Comando kill: > kill -9 <PID-processo da uccidere> 22 Esercizio n° 7 Scrivere uno script shell cercaDirectory che, nella directory corrente, (di lancio) crea un file di nome fileDir contenente l’ elenco di tutte le directory il cui nome inizia per lettera maiuscola Nota : nella directory di lancio, creare con il comando “mkdir” le seguenti directory : mkdir Nome mkdir Cognome mkdir Nome della città di residenza 23 Soluzione Esercizio n° 7 vero se il file esiste ed è una directory #!/bin/bash in questo modo si seleziona solamente il primo for file in `ls` caratteri di ogni linea. ( la prima lettera del do nome della directory) if [ -d $file ] then Espressione regolare a=`echo $file | cut -c1` b=-`echo $a | grep '[A-Z]'` if [ $b != - ] then echo $file >> fileDir fi File contenente l’elenco delle directory il fi cui nome inizia per lettera maiuscola done 24 Esercizio n° 8 Si realizzi uno script che chiameremo “Init” che genera 30 file vuoti denominati: node1.html, node2.html,…node30.html nella directory di lancio 25 Soluzione Esercizio n° 8 Inizializzazione della variabile #!/bin/bash di ciclo i=0 Incremento della variabile di while [ $i -lt 30 ] ciclo do i=$((i+1)) touch node$i.html done Entra nel ciclo fintanto che la variabile i è minore di 30 crea vuoto un file 26 Esercizio n° 9 Si realizzi uno script “addhead” che in ogni file nodeX.html creato con l’esercizio precedente, inserisca la stringa: <HEAD><TITLE>nodox.html</TITLE> <BODY><H1>nodox.html</H1><BR> </BODY> </HEAD> 27 Soluzione Esercizio n° 9 #!/bin/bash for i in `ls | grep html` do echo "<head><title>$i</title></head><body><h1>$i</h1></body >" > $i done scrive la node.html stringa nel i-esimo file 28 Esercizio n° 10 Si realizzi uno script “switch file1 file2”: che dati come argomenti due file esistenti, scambia il loro contenuto. file1 = votiUltimoAppello : Gianni 20/30 Bruno 27/30 Carlo 24/30 Alice 30/30 file2 = votiUltimoAppelloBackup (vuoto) Esempio di lancio script: $ ./switch.sh file1 file2 29 Soluzione Esercizio n° 10 copia il file passato come parametro nel fileTemp #!/bin/bash cp $1 fileTemp mv $2 $1 mv fileTemp $2 Muove (rinomina) il fileTemp che contiene il file contenuto nel primo parametro nel secondo parametro $1 = primo parametro passato alla shell $2 = secondo parametro passato alla shell muove (rinomina) il secondo parametro (secondo file) nel primo parametro (che contiene fileTemp) 30