Menu Fermer

Bash IFS : utilisation et exemples

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.

Bash IFS : utilisation et exemples

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
Qu'est-ce que IFS dans le bash Linux

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=","
Comment modifier IFS dans Linux

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.

Comment modifier IFS dans Linux

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.

Comment modifier IFS dans Linux

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