Editing di testo con Windows Bash

L’integrazione di una shell linux nei sistemi operativi Microsoft non è sicuramente passata inosservata e, tralasciando le spesso inutili faide tra i sostenitori dell’open source ed i beniamini del software proprietario, vediamo come imparare a sfruttare dal primo momento le caratteristiche positive di entrambi i sistemi e combinarne le potenzialità a nostro favore.

In particolare in questo articolo analizzeremo alcune delle funzionalità più amate dagli utilizzatori di linux, ovvero una serie di tool e comandi di cui un amministratore di sistema non potrà più fare a meno, soprattutto considerando che con l’ingresso prepotente della Powershell su Windows anche chi gestisce sistemi operativi Microsoft ha già scoperto come l’utilizzo di script possa velocizzare enormemente alcune operazioni. A tal proposito ci concentreremo nell’utilizzo dei comandi più comuni per la gestione dei file di testo e proveremo ad immaginare come questi comandi potrebbero aiutarci nella scrittura o nella modifica di tali file, tenendo presente, ad esempio, che quei file di testo potrebbero essere degli script Powershell.

E’ noto che in ambiente linux esistono parecchie decine di comandi con questo scopo ma per tenere fede all’intento introduttivo di questo articolo, mostreremo unicamente l’utilizzo di quelli più comuni.

Innanzi tutto inizieremo con il chiamare questa shell con il suo nome, Bash, che per i più curiosi è l’acronimo di Bourne Again SHell, dal nome del suo creatore Stephen Bourne.

Una piccola premessa è d’obbligo per introdurre alcune notazioni che utilizzeremo spesso in questa mini-guida, e che probabilmente vengono utilizzati in qualsiasi guida in cui vengono utilizzati comandi Bash. E’ fondamentale ricordare inoltre che la bash è CASE SENSITIVE, quindi scrivere comando è diverso da scrivere Comando, ed occorre tenere presente che tutti i comandi ed i tool di base di linux sono scritti con caratteri minuscoli. Per la Windows bash questa regola vale con una eccezione, in quanto file e cartelle sono considerati allo stesso modo di come vengono visti normalmente da Windows, ovvero in modo case insensitive. Negli screenshot seguenti si può notare come scrivendo un comando modificando maiuscole e minuscole si ottenga un messaggio di errore, invece i nomi delle cartelle e dei files vengono riconosciuti ugualmente.

Piccola nota per comprendere meglio le immagini: il comando ls è il corrispondente del comando DIR del DOS. Il comando cat serve per visualizzare il contenuto di un file di testo.

Redirezionamento dell’output di un comando:

Normalmente quando eseguiamo un comando, questo ci darà un output sullo standard output, cioè a video; se volessimo invece salvare quella risposta in un file potremmo direzionare l’output del comando con il simbolo > seguito dal nome del file. In particolare possiamo creare un file di nome risposta.txt che contiene l’output del comando comando in questo modo:

comando > risposta.txt

La notazione > creerà un file di nome risposta.txt sovrascrivendo l’eventuale file con lo stesso nome (senza chiedere conferma). Per accodare l’output ad un file esistente, invece, utilizzeremo la notazione >> seguita dal nome del file. In questo modo possiamo aggiungere al file risposta.txt esistente la risposta del comando comando2 con la seguente notazione:

comando2 >> risposta.txt

Con una notazione simile è possibile modificare anche lo standard input, per passare dei parametri ad un comando in una modalità diversa dall’immissione dei dati da tastiera. Per esempio potremmo eseguire il comando comando3 su tutto ciò che è contenuto nel file elenco.txt in questo modo:

comando3 < elenco.txt

Di conseguenza se volessimo passare il file elenco.txt al comando comando3 e salvare la risposta nel file risultato.txt possiamo utilizzare questa notazione

comando3 < elenco.txt > risultato.txt

E’ molto interessante la possibilità di passare l’output di un comando direttamente ad un altro comando anziché ad un file; questo viene fatto con il simbolo | (si legge pipe). Se volessimo eseguire il comando comando2 sulla risposta che ci viene data da comando1 utilizzando un unica riga di codice possiamo quindi scrivere:

comando1 | comando2

Comandi e tool:

Con queste minime nozioni sui simboli utilizzati per ottenere le risposte alle nostre operazioni nel modo desiderato possiamo iniziare a lavorare sui files di testo con alcuni comandi o tool riassumendoli schematicamente:

nano – Editor di testo di base

nano è un semplicissimo editor di testi, e contiene le funzionalità base per creare o modificare file di testo, potremmo dire che è l’equivalente del notepad su Windows. Possiamo avviarlo senza parametri per aprire un file vuoto con il comando

nano

in tal caso sarà necessario specificare un nome per il file al momento del primo salvataggio.

E’ possibile aprire il file testo.txt per la modifica scrivendo

nano testo.txt

in tal caso se il file testo.txt non esiste, verrà creato.

Con la schermata di nano aperta, in basso troviamo i comandi principali disponibili, richiamabili con CTRL+carattere, che utilizzeremo per tagliare, incollare, salvare o uscire.

Una lista completa dei comandi è visibile digitando CTRL+g, e mostrerà tutti i comandi compresi quelli per la formattazione del testo, lanciati premendo CTRL o ESC+carattere a seconda di come indicato.

cat – mostra contenuto di un file di testo

il comando cat è utilizzato per visualizzare il contenuto di un file, e viene lanciato con:

cat nomefile

E’ possibile concatenare più file per visualizzarli a video accodandoli uno all’altro. Se vogliamo ad esempio creare un unico file chiamato elencofull.txt che contiene tutti i nominativi presenti nei tre elenchi chiamati elenco1.txt
elenco2.txt ed elenco3.txt scriveremo:

cat elenco1.txt elenco2.txt elenco3.txt > elencofull.txt

Otterremo un risultato identico eseguendo tutti e tre questi comandi, facendo attenzione all’utilizzo di > oppure >> per utilizzare un nuovo file oppure uno esistente per redirezionare l’output del comando cat

cat elenco1.txt > elencofull.txt
cat elenco2.txt >> elencofull.txt
cat elenco3.txt >> elencofull.txt

Il comando cat scrive su schermo (o file) l’intero contenuto del file selezionato, quindi se il file è molto lungo non ci sarà possibile leggere la parte iniziale. A questo proposito è possibile utilizzare il comando seguente

less – mostra contenuto di un file di testo pagina per pagina

Il comando less mostra il contenuto di un file una pagina per volta, ed è possibile scorrere le pagine con le frecce UP e DOWN. Utilizzare q per uscire e tornare alla shell. La sintassi, come per il cat è molto semplice:

less nomefile.txt

È possibile utilizzare il comando less sfruttando l’output di un comando cat in questo modo:

cat elenco1.txt elenco2.txt | less

head – mostra le prime righe di un file di testo

Il comando head
mostra le prime 10 righe di un file di testo se lanciato senza opzioni, ossia:

head nomefile.txt

oppure le prime n righe se lanciato con head –n nomefile.txt. Per leggere le prime 20 righe di un file scriveremo quindi:

head -20 nomefile.txt (oppure head –n 20 nomefile.txt)

tail – mostra le ultime righe di un file di testo

Il comando tail
mostra le ultime 10 righe di un file di testo se lanciato senza opzioni, ossia:

tail nomefile.log

Come facilmente intuibile il comando è molto utile per la lettura di file di log, ed anche per questo comando può essere specificato il numero di righe da mostrare. Per mostrare le ultime 20 righe di un file utilizzeremo:

tail -20 nomefile.log (oppure tail –n 20 nomefile.log)

Un’opzione interessante è rappresentata da:

tail -f nomefile.log

che mostra in maniera interattiva cosa succede alla fine del file nomefile.log. Il comando in questo modo il comando resta in “ascolto” e mostra in tempo reale ciò che viene scritto alla fine del file selezionato fino a quando non viene interrotto con CTRL+c.

Nello screenshot seguente è possibile notare come non venga restituito il prompt dei comandi, ma il comando rimane in attesa di scrivere nello standard out (quindi a video) eventuali nuove righe scritte nel file.

Questa operazione non è possibile, ad esempio, con il tradizionale notepad o con qualsiasi editor windows, poiché per aggiornare la visualizzazione avremmo bisogno di chiudere e riaprire il file, o comunque di effettuare un refresh.

cmp – confronta due file

Il comando cmp
confronta due file di qualsiasi tipo (anche binari) e mostra in che riga ci sono le differenze. Se i due file sono uguali il comando non da risposta. La sintassi anche qui è molto semplice

cmp file1 file2



wc – visualizza numero di righe, parole e caratteri di un file

Il comando wc mostra il numero di righe, parole e caratteri di cui è composto un file, e viene lanciato con:

wc file.txt

con varie opzioni può essere utile per filtrare i risultati:

wc –l file.txt     mostra il numero di righe
wc –w file.txt     mostra il numero di parole
wc –c file.txt     
mostra il numero di caratteri

Il comando può essere utilizzato ovviamente anche sfruttando la notazione | (pipe) per utili funzioni:

cat file1.txt file2.txt | wc –l

In questo modo sarà visualizzato il numero di righe totali dei due file.

Per ora abbiamo giocato, e comunque c’è del materiale per iniziare a divertirsi o fare qualche prova con qualcosa di nuovo. Negli help di tutti i comandi ci sono decine e decine di opzioni che possono essere utili nei più svariati ambienti. Le ho omesse volutamente perché il fine di questa guida è provare a far nascere la curiosità di utilizzare comandi forse ad ora sconosciuti, senza perdersi nell’oceano delle possibilità offerte da semplicissimi editor di testo. Per visualizzare le opzioni disponibili per la maggior parte dei comandi è sufficiente scrivere comando –help

Nello screenshot seguente è possibile vedere come il semplicissimo comando cat abbia una decina di opzioni per modificarne le funzionalità.


Nella prossima puntata presenterò i tool sed ed awk, per focalizzare il punto esatto in cui lo scripting inizia a diventare una vera e propria arte.