Dans ce tutoriel, nous allons étudier la variable spéciale du shell Internal Field Separator (IFS).
Comme son nom l’indique il s’agit du séparateur de champ interne utilisé dans le Bash Linux.
Tout d’abord, nous allons discuter des valeurs par défaut de la variable IFS et comprendre ses différents cas d’utilisation. Ensuite, nous explorerons certaines implémentations en définissant des valeurs personnalisées dans IFS.
Table des matières
Qu’est-ce que IFS
La variable spéciale de l’interpréteur de commandes IFS (Internal Field Separator) détermine la manière dont Bash reconnaît les limites des mots lors de la division d’une séquence de chaînes de caractères.
La valeur par défaut de IFS est une chaîne de trois caractères comprenant un espace, une tabulation et une nouvelle ligne :
echo "$IFS" | cat -et
^I$
De ce fait, si on utilise une boucle for bash avec des mots séparés par un espace, la boucle va traiter chacun des mots.
fruits="pomme poire orange"
for i in $fruits
do
echo "'$i' est un fruit"
done
'pomme' est un fruit
'poire' est un fruit
'orange' est un fruit
Si on sépare les fruits par une tabulation, à l’aide de \t, on obtient le même résultat :
for i in `echo -e "pomme\tpoire\torange"`; do echo "'$i' est un fruit"; done
Enfin la même chose avec une nouvelle ligne que l’on peut substituer avec \n :
for i in `echo -e "pomme\npoire\norange"`; do echo "'$i' est un fruit"; done
Comment modifier IFS dans Linux
Dans le terminal
Il aussi bien comprendre qu’IFS est une variable que l’on peut donc modifier sans problème.
Dans le terminal, vous pouvez utiliser la commande export :
export IFS=","
Dans la boucle for
La boucle for ne permet pas de déclarer le IFS. Il faut donc modifier la variable avant son utilisation.
Par exemple, ici on indique la virgule comme séparateur de champs avant d’exécuter la boucle for.
IFS="," ; for i in `echo -e "pomme,poire,orange"`; do echo "'$i' est un fruit"; done
Comme vous pouvez le constater, si on ne change pas le séparateur, la boucle traite l’ensemble des fruits comme une seule valeur puisqu’aucun séparateur par défaut (espace, retour à la ligne ou tabulation) n’est présent.
Par contre, si on indique la virgule à utiliser comme séparateur de chams internet en modifiant la variable IFS, la boucle traite chaque fruit comme une valeur.
Dans la boucle while
La boucle while permet de déclarer le IFS.
Ici on déclare la variable IFS puis on utilise par exemple ici read pour lire les colonnes d’un fichier CSV dont le séparateur est la virgule.
#!/bin/bash
while IFS="," read -r col1 col2 col3 col4
do
echo "Nom: $col1"
echo "Prénom : $col2"
echo "Date de naissance : $col3"
echo "Lieu de naissance : $col4"
echo ""
done < <(tail -n +2 exemple.csv)
Ainsi la boucle va lire chaque ligne du fichier CSV (elle va parser le fichier CSV) pour stocker chaque valeur de colonne dans une variable $colX.
Ensuite on utilise la commande echo pour afficher la valeur.
IFS dans les commandes cut et awk
La commande cut permet de filtrer les données textes et la commande awk d’effectuer des traitements de texte avancés.
Pour modifier le séparateur de champs (IFS) avec la commande cut, il faut utiliser l’option -d.
Par exemple ici pour utiliser la virgule pour lire un fichier csv :
cut -d ',' -f 2 etudiant.csv
Du côté de la commande awk, il faut utiliser l’option -F ou l’option FS comme ceci :
awk -F, '{print $1}' employes.csv
awk '{print $3}' FS="," employes.csv
- Comment utiliser la commande AWK avec des exemples
- La commande cut de Linux : utilisation et exemples
Liens
- 12 astuces bash à connaitre sur Linux
- Utiliser if, then en Bash Linux
- La boucle for en bash Linux avec +10 exemples
- La boucle while en bash Linux avec 7 exemples
- Comment utiliser la boucle until en Bash avec des exemples
- Bash IFS : utilisation et exemples
- Qu’est-ce que le fichier .bashrc, .bash_profile et .profile et les différences sous Linux
- Comment exécuter un fichier sur Linux (script shell ou binaire)
- Qu’est-ce qu’un fichier .sh et comment l’ouvrir
- Savoir quel est le shell de son Linux