androide

Come leggere un file riga per riga in bash

Corso di terminale linux - la shell

Corso di terminale linux - la shell

Sommario:

Anonim

Quando scrivi gli script di Bash, a volte ti troverai in situazioni in cui devi leggere un file riga per riga. Ad esempio, potresti avere un file di testo contenente dati che dovrebbero essere elaborati dallo script.

In questo tutorial, discuteremo come leggere un file riga per riga in Bash.

Lettura di un file Sintassi riga per riga

La sintassi più generale per la lettura di un file riga per riga è la seguente:

while IFS= read -r line do echo "$line" done < input_file

o la versione equivalente a linea singola:

while IFS= read -r line; do echo $line; done < input_file

Come funziona?

Il file di input ( input_file ) è il nome del file che si desidera aprire per la lettura con il comando read . Il comando read legge il file riga per riga, assegnando ciascuna riga alla variabile line . Una volta elaborate tutte le linee, il ciclo while termina. Il separatore di campo interno ( IFS ) è impostato sulla stringa nulla per preservare gli spazi bianchi iniziali e finali che è il comportamento predefinito del comando read .

Lettura di un file Esempi linea per linea

Diamo un'occhiata al seguente esempio. Supponiamo di avere un file chiamato distros.txt contenente un elenco di alcune delle distribuzioni Linux più popolari e i loro gestori di pacchetti separati da virgola ( , ):

distros.txt

Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf

Per leggere il file riga per riga, esegui il seguente codice nel tuo terminale:

while IFS= read -r line do echo "$line" done < distros.txt

Il codice leggerà il file per riga, assegnerà ciascuna riga a una variabile ed eseguirà l'eco della variabile. Basicity vedresti lo stesso output di se visualizzassi il contenuto del file usando il comando cat.

Cosa succede se si desidera stampare solo le distribuzioni che utilizzano apt? Un modo sarebbe usare l'istruzione if e verificare se la riga contiene la sottostringa apt:

while IFS= read -r line do if]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

Durante la lettura del file riga per riga, è anche possibile passare più di una variabile al comando read che suddividerà la riga in campi basati IFS . Il primo campo viene assegnato alla prima variabile, il secondo alla seconda variabile e così via. Se sono presenti più campi che variabili, i campi rimanenti vengono assegnati all'ultima variabile.

Nel seguente esempio, stiamo impostando IFS su una virgola ( , ) e passando due variabili distro e pm al comando read. Tutto dall'inizio della riga fino alla prima virgola verrà assegnato alla prima variabile ( distro ) e il resto della riga verrà assegnato alla seconda variabile ( pm ):

while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt

apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora

Metodi di lettura dei file alternativi

Utilizzo di una sostituzione di processo

La sostituzione del processo consente di passare l'output dal comando come nome file:

while IFS= read -r line do echo "$line" done < <(cat input_file)

Utilizzando una stringa Here

Here String è una variante del documento Here. La stringa (cat input_file) manterrà le nuove righe:

while IFS= read -r line do echo "$line" done <<< $(cat input_file)

Utilizzando il descrittore di file

Puoi anche fornire l'input al loop usando un descrittore di file:

while IFS= read -r -u9 line do echo "$line" done 9< input_file

Quando si lavora con i descrittori di file, utilizzare un numero compreso tra 4 e 9 per evitare conflitti con i descrittori di file interni della shell.

Conclusione

In Bash, possiamo leggere un file riga per riga fornendo il nome file come input per un ciclo di lettura while.

bash terminal