L’utilitaire de column formate son entrée en plusieurs colonnes. Cette commande permet également d’obtenir une sortie au formatJSON.
Préliminaires
Les fichiers de configuration Linux sont généralement des fichiers textes, les lignes commençant par le caractère #
sont ignorées (elles permettent de mettre des commentaires). Le séparateur de champ est suivant le cas l’espace ou le caractère :
.
Dans la suite, on utilisera certain de ces fichiers pour produire des flux JSON.
Utilisation de column
Voici un usage classique de la commande column :
sed 's/#.*//' /etc/fstab |
column --table --table-columns SOURCE,TARGET,TYPE,OPTIONS,PASS,FREQ --table-right PASS,FREQ
Explications :
- La commande sed supprime les lignes contenant des commentaires (elle commence par le caractère
#
) - La commande column effectue le formatage :
- Le drapeau
--table
(ou-t
) implique que columns détermine d'abord le nombre de colonnes afin de générer le tableau. Par défaut, les colonnes sont délimitées par des espaces, avec les caractères fournis en utilisant l’option--output-separator
. - L’option
--table-columns
permet de les noms des colonnes à l’aide d’une liste de noms séparés par des virgules. - L’option
--table-right
demande d’aligner à droite le texte dans les colonnes spécifiées.
- Le drapeau
Ce qui donne :
SOURCE TARGET TYPE OPTIONS PASS FREQ
proc /proc proc defaults 0 0
PARTUUID=9b2f03bd-01 /boot/firmware vfat defaults 0 2
PARTUUID=9b2f03bd-02 / ext4 defaults,noatime 0 1
Formater en JSON
Dans la mesure ou l’option --table-columns
a été définie dans l’exemple précédant, il suffit d'ajouter le drapeau --json
.
sed 's/#.*//' /etc/fstab |
column --table --table-columns SOURCE,TARGET,TYPE,OPTIONS,PASS,FREQ --table-right PASS,FREQ --json
En réalité, dans cet exemple l’option --table-right
est inutile avec l’option --json
. Cela revient donc à utiliser :
sed 's/#.*//' /etc/fstab |
column --table --table-columns SOURCE,TARGET,TYPE,OPTIONS,PASS,FREQ --json
et on obtient :
{
"table": [
{
"source": "proc",
"target": "/proc",
"type": "proc",
"options": "defaults",
"pass": "0",
"freq": "0"
},{
"source": "PARTUUID=9b2f03bd-01",
"target": "/boot/firmware",
"type": "vfat",
"options": "defaults",
"pass": "0",
"freq": "2"
},{
"source": "PARTUUID=9b2f03bd-02",
"target": "/",
"type": "ext4",
"options": "defaults,noatime",
"pass": "0",
"freq": "1"
}
]
}
On peut bien-sur enchaîner avec jq :
sed 's/#.*//' /etc/fstab |
column --table --table-columns SOURCE,TARGET,TYPE,OPTIONS,PASS,FREQ --json |
jq -c '.table[]'
qui produira :
{"source":"proc","target":"/proc","type":"proc","options":"defaults","pass":"0","freq":"0"}
{"source":"PARTUUID=9b2f03bd-01","target":"/boot/firmware","type":"vfat","options":"defaults","pass":"0","freq":"2"}
{"source":"PARTUUID=9b2f03bd-02","target":"/","type":"ext4","options":"defaults,noatime","pass":"0","freq":"1"}
Exemple avec d’autres fichiers de configuration
La liste des utilisateurs :
sed 's/#.*//' /etc/passwd |
column --json --table-columns 'user,x,uid,gid,name,home,shell' --separator ':'
La liste des groupes :
sed 's/#.*//' /etc/group |
column --json --table-columns 'group,x,gid,users' --separator ':'
Mais pour ce cas, on ne veut pas avoir null
lorsque la liste des utilisateurs est vide, et dans l’autre cas, on veut un tableau contenant les utilisateurs. Pour cela il faut réécrire le champ .user
comme suit :
sed 's/#.*//' /etc/group |
column --json --table-columns 'group,x,gid,users' --separator ':' |
jq '.table | map( . + {"users": (if .users then .users | split(",") else [] end) } )'
Liens
Les manuels :
- de la commande column,
- du fichier /etc/fstab,
- du fichier /etc/group,
- du fichier /etc/passwd,
- La FAQ de jq en anglais,
- Le manuel de jq en anglais (Vous pouvez choisir la version de jq).
ᦿ