...

esercizi sed, awk e scripting

by user

on
Category: Documents
124

views

Report

Comments

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
Fly UP