Android

Comment lire un fichier ligne par ligne en bash

Ubuntu - Linux : Gestion des fichiers avec la ligne de commandes

Ubuntu - Linux : Gestion des fichiers avec la ligne de commandes

Table des matières:

Anonim

Lors de l'écriture de scripts Bash, vous vous retrouverez parfois dans des situations où vous devrez lire un fichier ligne par ligne. Par exemple, vous pouvez avoir un fichier texte contenant des données qui doivent être traitées par le script.

Dans ce tutoriel, nous verrons comment lire un fichier ligne par ligne dans Bash.

Lire un fichier ligne par ligne de syntaxe

La syntaxe la plus générale pour lire un fichier ligne par ligne est la suivante:

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

ou la version monoligne équivalente:

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

Comment ça marche?

Le fichier d'entrée ( input_file ) est le nom du fichier que vous souhaitez ouvrir en lecture par la commande de read . La commande de lecture lit le fichier ligne par ligne, en affectant chaque ligne à la variable de line . Une fois toutes les lignes traitées, la boucle while se terminera. Le séparateur de champ interne ( IFS ) est défini sur la chaîne nulle pour conserver les espaces blancs de début et de fin, qui est le comportement par défaut de la commande de read .

Lecture d'un fichier Exemples ligne par ligne

Jetons un coup d'œil à l'exemple suivant. Supposons que nous ayons un fichier nommé distros.txt contenant une liste de certaines des distributions Linux les plus populaires et leurs gestionnaires de paquets séparés par une virgule ( , ):

distros.txt

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

Pour lire le fichier ligne par ligne, vous devez exécuter le code suivant dans votre terminal:

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

Le code lira le fichier par ligne, assignera chaque ligne à une variable et fera écho à la variable. Fondamentalement, vous verriez la même sortie que si vous affichez le contenu du fichier à l'aide de la commande cat.

Et si vous souhaitez imprimer uniquement les distributions qui utilisent apt? Une façon serait d'utiliser l'instruction if et de vérifier si la ligne contient la sous-chaîne apt:

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

Ubuntu, apt Debian, apt

Lors de la lecture d'un fichier ligne par ligne, vous pouvez également transmettre plusieurs variables à la commande read qui divisera la ligne en champs basés sur l' IFS . Le premier champ est affecté à la première variable, le second à la deuxième variable, etc. S'il y a plus de champs que de variables, les champs restants sont affectés à la dernière variable.

Dans l'exemple suivant, nous définissons IFS sur une virgule ( , ) et passons deux variables distro et pm à la commande de lecture. Tout depuis le début de la ligne jusqu'à la première virgule sera affecté à la première variable ( distro ) et le reste de la ligne sera affecté à la deuxième variable ( 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

Méthodes alternatives de lecture de fichiers

Utilisation d'une substitution de processus

La substitution de processus vous permet de passer la sortie de la commande en tant que nom de fichier:

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

Utilisation d'une chaîne Here

Here String est une variante du document Here. La chaîne (cat input_file) conservera les sauts de ligne:

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

Utilisation du descripteur de fichier

Vous pouvez également fournir l'entrée à la boucle à l'aide d'un descripteur de fichier:

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

Lorsque vous travaillez avec des descripteurs de fichiers, utilisez un nombre compris entre 4 et 9 pour éviter tout conflit avec les descripteurs de fichiers internes du shell.

Conclusion

Dans Bash, nous pouvons lire un fichier ligne par ligne en fournissant le nom de fichier en entrée d'une boucle de lecture while.

terminal bash