giovedì 8 dicembre 2011

Malato... Terminale [Parte 4]

Nella quarta parte di "Malato...Terminale" vedremo come utilizzare il simbolo di pipe, gestire l'input e l'output e ordinare semplici file.
Nel terminale una pipe è rappresentata dal simbolo " | ", che funge da collegamento tra due istruzioni, precisamente serve per collegare il risultato dell'espressione precedente, con quella che la segue. Un  utilizzo immediato della pipe è il contatore di file presenti in una directory. Creiamo una directory Prova e popoliamola con 3 file mediante il comando Touch. Dopodiché digitiamo:

ls | wc -l

Il comando wc sta per word counter e, come potrete vedere dal risultato di questo comando, restituisce il numero dei file contenuti nella nostra cartella. Praticamente il comando ls "restituisce" i file che, mediante la pipe, vengono "passati" al comando wc, che li conta.

Nell'immagine vengono usati più comandi legati da &&: questo simbolo, in programmazione, corrisponde all'operatore logico "AND". L'operazione che segue la prima viene effettuata se e solo se la prima ha avuto successo. Un'altro simbolo è rappresentato con due pipe "||", che nel terminale è usato per generare la seconda istruzione se la prima non ha avuto successo .


Ora vediamo come utilizzare gli input e gli output nel terminale.
Esaminiamo il comando cat: questo comando serve per mostrare sullo schermo il contenuto di un determinato file.

Questo avviene perché l'output di default del terminale è lo schermo stesso, così come l'input standard è la tastiera. Proviamo a modificare l'output: scriviamo il comando cat seguito dal segno > e dal nome di un file. Nel mio esempio


cat > KnightMovesBFSGrafi.cpp


Nel prompt che vi si presenterà dovreste scrivere qualsiasi cosa vogliate, terminando con control-c.
Se ora provate a leggere quel file, tramite cat NomeFile, ritroverete quello che avete scritto.
Notate che il contenuto primordiale del file è stato cancellato, quindi usate questo comando per scrivere in un file vuoto non per aggiungere nuove righe!!

Dalla foto notate che la riga in cui compare il control-c non viene scritta, quindi il comando per uscire va scritto in una riga vuota.
Per poter scrivere stringhe in modo tale che siano "appese" al nostro file, senza cancellare nulla, basta usare il comando >> anziché >.

Anche l'operatore di input può essere cambiato (ridirezionato) mediante l'operatore <. Possiamo creare uno stream di input che proviene da un file scelto da noi. Proviamo un esempio molto semplice ed efficace: vogliamo scrivere tutte le nostre spese in un file con i prezzi e i nomi degli oggetti comprati. Di  volta in volta immettiamo nuovi prezzi con a fianco il nome del prodotto mediante l'uso di cat > nomeFile. Ora vogliamo ordinare il tutto per prezzo minore, controllando quali sono state le nostre spese meno care. Bene ora possiamo utilizzare il comando:

sort < ProvaA > ProvaB

Dove il file ProvaA contiene tutte le nostre spese alla rinfusa, così come sono state immesse e ProvaB è un file vuoto.  Quando la shell ci restituisce il prompt dei comandi, digitiamo
cat ProvaB
Ecco qui tutte le nostre spese ordinate in modo crescente!

Il terminale ordina prova A (comando sort < ProvaA) dato che l'input non è più la tastiera ma il file nominato "ProvaA". Dopodiché tutto il file, ordinato, va come output in ProvaB e dunque viene scritto lì. Se digitate su terminale "man sort" si aprirà la pagina del manuale integrato UNIX che vi spiegherà la sintassi del comando e le varie opzioni applicabili.
Ad esempio se vogliamo partire da un campo (in questo caso un campo corrisponde ad una colonna), anziché dal primo campo scritto, basta far seguire il sort da due numeri:
+n -m;
n >> verrà preso il primo carattere  della n+1 colonna (o campo);
m >> determina il carattere finale, preso alla m-esima colonna (o campo);
Nel nostro esempio, ordiniamo gli acquisti per nome. Basterà fare:

sort +1 -2 < ProvaB > ProvaC


+1 --> Dato che la prima colonna del nome è il secondo campo (dunque con il nostro +1 il terminale si prende il primo carattere della colonna numero n+1 = 2)
-2 --> L'ultimo carattere è quello dalla seconda colonna, dunque -2.
Il terminale ordinerà in base all'ordine comune delle lettere, dalla a alla z, partendo dal primo carattere della seconda  colonna (indicato con il +1) e finendo all'ultimo della stessa (indicato come -2).

Se volessimo raggruppare i campi in base a delimitatori diversi dallo spazio, che è il delimitatore di default, basta aggiungere il flag "-t[delim]" ad esempio creiamo un file con dei dipendenti nel formato descritto in foto;

scrivendo:
sort -t: +1 -2 ProvaD
avremo gli impiegati ordinati per matricola, dato che ora il terminale non conta più gli spazi come campi ma li dividerà con il delimitatore inserito. (nel nostro caso ':').

Link delle parti precedenti:

Malato...Terminale parte prima: qui
Malato...Terminale parte seconda: qui
Malato...Terminale parte terza: qui

Nella quinta parte vedremo l'uso del comando grep e un'anteprima sui permessi.



Nessun commento:

Posta un commento