La commande df indique l’espace occupé par les systèmes de fichiers, elle affiche son résultat sous la forme d’un tableau.
La commande jc permet de convertir la sortie de la plupart des commandes Linux en JSON, cependant cette commande n’existe pas par défaut sur la plupart des systèmes (noter également le cas pour la commande jq)
Voici des solutions qui se passent de jc.
La commande df ne produit pas naturellement de sortie JSON, il va donc falloir retravailler le résultat obtenu.
Pour ce billet, on fait le choix arbitraire d’ignorer :
- les systèmes de fichier spécifique (ex : squashfs,tmpfs…),
- les disques distants
Noter que le champ target
(le point de montage) peut contenir des espaces, il est donc prudent de le mettre en fin de ligne pour le découpage des colonnes.
La solution à l'aide de jq
Bon pour commencer voici la solution utilisant la commande jc (qui s'installe à l'aide du paquet jc
) :
df --human-readable --local --output='source,fstype,itotal,iused,iavail,ipcent,size,used,avail,pcent,file,target' |
/bin/jc --df |
jq 'map( select( .filesystem != "tmpfs" ) )'
Une solution utilisant column
df --human-readable --local --output='source,fstype,itotal,iused,iavail,ipcent,size,used,avail,pcent,file,target' |
sed -e '1d' -e '/^tmpfs[[:blank:]].*$/d' |
while read -r source fstype itotal iused iavail ipcent size used avail pcent file target ; do
echo -e "${source}\t${fstype}\t${itotal}\t${iused}\t${iavail}\t${ipcent}\t${size}\t${used}\t${avail}\t${pcent}\t${file}\t${target}"
done |
column -ts $'\t' --table --table-columns 'source,fstype,itotal,iused,iavail,ipcent,size,used,avail,pcent,file,target' --json |
jq '.table'
Une solution uniquement avec jq
df --human-readable --local --output='source,fstype,itotal,iused,iavail,ipcent,size,used,avail,pcent,file,target' |
sed -e '1d' -e '/^tmpfs[[:blank:]].*$/d' |
while read -r source fstype itotal iused iavail ipcent size used avail pcent file target ; do
jq --null-input \
--arg source "${source}" \
--arg fstype "${fstype}" \
--arg itotal "${itotal}" \
--arg iused "${iused}" \
--arg iavail "${iavail}" \
--arg ipcent "${ipcent}" \
--arg size "${size}" \
--arg used "${used}" \
--arg avail "${avail}" \
--arg pcent "${pcent}" \
--arg file "${file}" \
--arg target "${target}" \
'{
source:$source,
fstype:$fstype,
itotal:$itotal,
iused:$iused,
iavail:$iavail,
ipcent:$ipcent,
size:$size,
used:$used,
avail:$avail,
pcent:$pcent,
file:$file,
target:$target
}'
done |
jq --slurp '.'
En dehors de JSON
Si le but est par exemple d’afficher l’espace disponible des disques locaux, on peut se limiter à utiliser df (avec l’option -P
pour la portabilité POSIX
).
df -h -T -P |
sed -e '1d' \
-e '/^.*[[:blank:]]cifs[[:blank:]].*$/d' \
-e '/^.*[[:blank:]]devtmpfs[[:blank:]].*$/d' \
-e '/^.*[[:blank:]]fuse.sshfs[[:blank:]].*$/d' \
-e '/^.*[[:blank:]]squashfs[[:blank:]].*$/d' \
-e '/^.*[[:blank:]]tmpfs[[:blank:]].*$/d'
La liste des types de système de fichier à filtre est à modifier suivant vos besoins.
Les champs de la portabilité POSIX
dans l’ordre :
Libellé En | Libellé Fr | Nom du champ |
---|---|---|
Filesystem | Sys. de fichiers | source |
Type | Type | fstype |
Size | Taille | size |
Used | Utilisé | used |
Available | Dispo | avail |
Capacity | Uti% | pcent |
Mounted on | Monté sur | target |
On peut utiliser une boucle similaire à la construction du JSON pour mettre en forme ce résultat : Voir cet exemple.
Liens
- Le manuel de la commande column [En],
- Le manuel de la commande df en français,
- Le manuel de la commande jq [En] et sa documentation complète,
- Le manuel de la commande sed [En],
- 🐚 jc : « JSONifier » les commandes Linux.,
- La FAQ de jq en anglais,
- Le manuel de jq en anglais (Vous pouvez choisir la version de jq).
ᦿ