10 trucchi e scorciatoie da sapere se usi BASH

· 6 min lettura
10 trucchi e scorciatoie da sapere se usi BASH

1 - Ricerca tra i comandi

Se si volesse cercare un comando precedentemente inserito, basta premere la combinazione CTRL + R per poter cercare nell'intera cronologia dei comandi qualsiasi parte del comando precedentemente inserito.

Esempio:

$ grep -ir passwd /*
[...]

Se volessi cercare il comando inserito "grep", premerò CTRL + R e scriverò "grep". In grassetto il testo inserito dall'utente. A destra di quanto inserito, vi sarà la corrispondenza trovata. Per navigare tra le corrispondenze, premere il tasto TAB, altrimenti premere INVIO.

$ (premuto CTRL + R)
(reverse-i-search)`':
(reverse-i-search)`grep': grep -ir passwd /*

2 - Uno o due comandi addietro...

Per eseguire il comando precedentemente inserito, si usano due punti esclamativi.

$ ls /
bin   cache  dev  home  lib    media  opt   root  sbin  srv  tmp  var boot  data   etc  init  lib64  mnt    proc  run   snap  sys  usr
$ !!
ls
bin   cache  dev  home  lib    media  opt   root  sbin  srv  tmp  var boot  data   etc  init  lib64  mnt    proc  run   snap  sys  usr

In maniera analoga, digitare un punto esclamativo seguito da un trattino e un numero, ri-eseguirà il comando posto nella posizione del numero scritto nella cronologia comandi.

$ echo Messaggio 1 
Messaggio 1
$ echo Messaggio 2 
Messaggio 2
$ echo Messaggio 3 
Messaggio 3
$ !-2
echo Messaggio 2
Messaggio 2

3 - Cronologia dei comandi

Tutti i comandi eseguiti sulla console sono memorizzati e numerati.
Sono visualizzabili tramite il comando history.

$ ls /home
[...]
$ ls /root
[...]
$ mv src.txt dst.txt

$ history
215 ls /home
216 ls /root
217 mv src.txt dst.txt
218 history

Come si può notare, il comando history è compreso nella cronologia quando viene inserito.

Se si volesse cancellare questa cronologia basterà digitare il comando history -c.

4 - Prendere in prestito il parametro precedente

La shell permette di utilizzare il parametro utilizzato da un altro comando per un'operazione.
Tale operazione si fa con la sintassi !$.

$ cat file.txt
Questo è un file di prova
$ cat !$
Questo è un file di prova

Per selezionare tutti i parametri precedenti, si cambia il simbolo del dollaro con un asterisco.

$ cat file.txt file2.tx
Questo è un file di prova
Questo è un altro file di prova

$ cat !*
Questo è un file di prova
Questo è un altro file di prova

5 - Autocompletamento

L'autocompletamento salva del tempo prezioso, chiedendo alla console di provare a completare il comando/parametro.

L'autocompletamento si ha premendo due volte il tasto TAB.

$ ls /etc/pyt(TAB)(TAB)
$ ls /etc/python

$ cat fil(TAB)(TAB)
$ cat file.txt

Premere due volte il tasto mentre le possibilità sono molteplici le mostrerà a schermo, permettendo di poter inserire altri caratteri per selezionare la scelta desiderata.

$ ls /etc/python3(TAB)(TAB)
python3/   python3.5/
$ cat /etc/pass(TAB)(TAB)
passwd   passwords

6 - Testa o coda

Per visualizzare le ultime righe o le prime righe di un file o flusso di dati, si usano i rispettivi comandi head e tail.

Di default, entrambi i comandi restituiranno le prime 10 e le ultime 10 righe di un file o un flusso di dati.

$ tail file_100_righe.txt
riga 91
riga 92
riga 93
riga 94
riga 95
riga 96
riga 97
riga 98
riga 99
riga 100

$ head file_100_righe.txt
riga 1
riga 2
riga 3
riga 4
riga 5
riga 6
riga 7
riga 8
riga 9
riga 10

Per visualizzare le prime/ultime N righe, basta scrivere N dopo un trattino "-", subito dopo il comando.

$ head -2 file_100_righe.txt
riga 1
riga 2

$ tail -3 file_100_righe.txt
riga 98
riga 99
riga 100

Per poter leggere un file in tempo reale (per esempio un file di log), si usa il comando tail -f, che permette di aprire il file e di lasciarlo aperto per mostrare a schermo le modifiche in tempo reale che vengono eseguite nel file.

7 - Ordinare e rimuovere i duplicati

Quando si elenca il contenuto di un file, può capitare che esso debba essere ordinato secondo un criterio o che si vogliano rimuovere i valori duplicati presenti all'interno.

Per ordinare i contenuti di un file/flusso in input, si usa il comando sort.

Esempi di sintassi del comando sono:

sort       # ordinare i valori ricevuti alfabeticamente
sort -n    # ordinare i valori ricevuti numericamente
sort -r    # inverte l'ordine
sort -R    # ordinare i valori ricevuti in maniera casuale

Per rimuovere i valori duplicati o ripetuti, si usa il comando uniq:

$ cat file_esempio.txt
La vispa teresa
Avea tra l'erbetta
A volo sorpresa
Gentil farfalletta
La vispa teresa
Gentil farfalletta

$ sort file_esempio.txt
A volo sorpresa
Avea tra l'erbetta
Gentil farfalletta
Gentil farfalletta
La vispa teresa
La vispa teresa

$ sort file_esempio.txt | uniq
A volo sorpresa
Avea tra l'erbetta
Gentil farfalletta
La vispa teresa

ATTENZIONE: Il comando UNIQ si usa solo su valori già ordinati!

Per rimuovere i duplicati da una lista già ordinata, si può anche usare un parametro del comando sort stesso:

$ sort -u file_esempio.txt
A volo sorpresa
Avea tra l'erbetta
Gentil farfalletta
La vispa teresa 

8 - Prendere solo quello che serve

Se l'output di un comando è troppo lungo o contiene troppe informazioni non necessarie, sarebbe necessario "filtrare" l'output.

Per fare ciò si può utilizzare uno strumento molto potente: awk.

Questo comando è sicuramente troppo complicato da spiegare in un paragrafo e sicuramente quello che sa fare potrebbe non servirvi, quindi limiterò soltanto le funzioni che potrebbero servire al fine sopra citato.

Awk è un linguaggio di programmazione per l'elaborazione di testo.
Un uso per cui scelgo sempre questo comando è il filtrare o personalizzare un output.

Per esempio, se si volesse stampare a schermo solo la prima colonna (di default lo spazio è il carattere separatore) si userebbe questa sintassi:

$ cat file.txt
Hello World! I'm a file

$ cat file.txt | awk '{print $1}'
Hello

Dando come parametro del comando semplicemente '{print $1}' verrà stampata solo la prima colonna dell'output precedentemente visualizzato.

Per impostare un separatore personalizzato, si usa il parametro -F, seguito dal carattere da interpretare come separatore.

$ cat file.txt
Hello World! ; I'm a file

$ cat file.txt | awk -F ';' '{print $1}'
Hello World

$ cat file.txt | awk -F ';' '{print $2}'
I'm a file

Nel primo esempio è stata visualizzata la prima "colonna" di output.
Allo stesso modo, nel secondo esempio, la seconda colonna sarebbe tutta la seconda parte dell'output, ossia "I'm a file".

Con AWK sarebbe possibile scrivere parti di testo oltre al semplice riportare dati che legge in input, vediamo come.

Il file di esempio contiene il giorno di monitoraggio, il nome della CPU, la temperatura e il tempo di attività espresso in secondi.

$ cat log_cpu.txt
041018 cpu1 60.0 8442
041018 cpu2 59.1 8442
051018 cpu1 78.0 2055
051018 cpu2 66.2 2055
061018 cpu1 57.2 6114
061018 cpu2 55.8 6114

Ora, se a noi interessasse solamente sapere la temperatura dei processori, senza avere alcun'altra informazione, si potrebbe fare così:

$ cat log_cpu.txt | awk '{print $3}'
60.0
59.1
78.0
66.2
57.2
55.8

Se, invece, volessimo indicare qualcosa che non è compreso nell'output, si può scrivere tra virgolette nel punto in cui lo desideriamo:

$ cat log_cpu.txt | awk '{print $3 " gradi"}'
60.0 gradi
59.1 gradi
78.0 gradi
66.2 gradi
57.2 gradi
55.8 gradi

Se volete sapere più informazioni su AWK, visitate la pagina ufficiale del progetto GNU (inglese).

9 - Eseguire più comandi su una riga

Per eseguire più di un comando su una sola riga, esistono due modi.

Per eseguire un comando solo dopo che quello precedente è stato eseguito, si usano due ampersand "&".

$ mkdir Nuova && cd Nuova

In questo esempio è ovvio che non ci si potrebbe spostare nella cartella "Nuova" se essa non fosse prima creata, quindi risulta necessario eseguire prima il primo comando e poi il secondo.

Se volessimo che il risultato del primo comando possa agire indipendentemente dal successivo, si usa il punto e virgola.

$ mkdir Nuova; touch Nuovo_File.txt

In questo esempio, se la cartella "Nuova" non dovesse essere creata, non influenzerebbe lo svolgersi del comando successivo, ossia la creazione del file "Nuovo_File".

10 - Scorciatoie da tastiera

Ctrl + A    Vai ad inizio della riga che si sta scrivendo
Ctrl + E    Vai alla fine della riga che si sta scrivendo
Ctrl + L    Pulisce lo schermo. Stesso effetto del comando "clear"
Ctrl + U    Elimina tutto ciò che è a sinistra del cursore. Se ci si trova a fine riga, elimina l'intera riga
Ctrl + H    Elimina il carattere a sinistra del cursore
Ctrl + C    Uccide il processo corrente (SIGINT)
Ctrl + D    Chiude la shell
Ctrl + Z    Manda in riposo l'operazione corrente (SIGSTP)
Ctrl + W    Elimina l'intera parola prima del cursore
Ctrl + K    Elimina tutto ciò che è a destra del cursore
Ctrl + T    Scambia i due caratteri a sinistra del cursore
Esc + T     Scambia le due parole a sinistra del cursore
Alt + F     Sposta il cursore alla parola successiva nella riga che si sta scrivendo
Alt + B     Sposta il cursore alla parola precedente nella riga che si sta scrivendo