The Terminal open on Ubuntu.
Agence web » Actualités du digital » Les outils intégrés à Linux sont si puissants que vous créez une base de données avec eux. Voici comment

Les outils intégrés à Linux sont si puissants que vous créez une base de données avec eux. Voici comment

Une base de données est un élément essentiel de nombreuses applications, des sites Web d'entreprise à part entière aux outils simples tels que les listes de courses et les suivis financiers. Les bases de données relationnelles pilotées par SQL sont populaires, mais Linux offre une alternative plus simple et plus transparente.

Quel type de base de données puis-je créer sous Linux ?

Sous Linux, le fichier texte est roi. Avec de nombreux outils robustes et un écosystème qui encourage leur enchaînement, vous pouvez réaliser beaucoup de choses avec des fichiers texte brut.

Cela inclut la création d’une base de données, un ensemble structuré de données que vous pouvez utiliser à de nombreuses fins. À l’aide de fichiers texte et d’outils de ligne de commande, vous pouvez créer des prototypes simples, inspecter rapidement vos données et contrôler la version de vos données aussi facilement que n’importe quel code.

Il existe de nombreuses commandes Linux utiles et beaucoup d'entre elles fonctionnent avec du texte. Beaucoup de ces commandes sont des filtres qui reçoivent des données via une entrée standard, effectuent certaines actions et produisent une sortie standard.

  • grep recherche dans les entrées et sélectionne les lignes qui correspondent à un ou plusieurs modèles.
  • couper extrait les parties sélectionnées de chaque ligne et les écrit sur la sortie standard.
  • embarrassant est un langage d'analyse et de traitement de modèles plus puissant.
  • trier fait exactement ce à quoi vous vous attendez, mais il peut trier des colonnes spécifiques et gérer correctement le tri numérique/alphabétique.
  • tête et queue vous permet d'extraire une tranche de lignes de la sortie.
  • rejoindre prend en charge les données associées dans plusieurs fichiers.

Dans cet exemple, vous allez créer une base de données simple pour une application de tâches. Vous pouvez créer toutes les fonctionnalités de base à l’aide des outils Linux standard. Finalement, vous pouvez étendre l'application en utilisant un langage de script ou en migrant vers une base de données relationnelle.

Créer des tableaux sous forme de fichiers plats

L'un des formats de texte structuré les plus simples est le DSV, ou valeurs séparées par des délimiteurs. Il s'agit d'un cas général du format CSV (valeurs séparées par des virgules). Sous Linux, les fichiers texte structurés utilisent souvent le caractère espace ou deux-points (:) pour séparer les champs. Le fichier /etc/passwd est un exemple classique :

Vous pouvez stocker de nombreux types de données, comme une liste de tâches, avec ce type de format :

Buy milk:2024-10-21:2:open
Call bank:2024-10-20:1:closed

Vous pouvez utiliser n'importe quel éditeur de texte pour mettre à jour votre base de données, un avantage supplémentaire du format texte brut. Vous pouvez même ajouter des éléments directement depuis la ligne de commande en redirigeant la sortie de echo vers un fichier :

echo "Take out the trash:$(date -I):3:open" > tasks 

C'est l'équivalent du SQL :

INSERT INTO tasks VALUES('Take out the trash', CURDATE(), '3', 'open') 

Notez que cette commande utilise une sous-commande pour obtenir la date actuelle. C'est un peu gênant si vous le tapez, mais dans un script, cela peut être beaucoup plus pratique.

Récupérer une table entière

La sélection de données est probablement la tâche de base de données la plus courante. Le cas de base est de tout sélectionner dans une table, c'est à dire

SELECT * FROM tasks 

Qui récupère toutes les colonnes de chaque ligne d'une base de données. Avec une base de données basée sur des fichiers, l'équivalent est trivial :

cat tasks 

Sélectionnez les colonnes avec coupe

En étant un peu plus sophistiqué, vous pouvez affiner votre sélection à des colonnes spécifiques. En SQL, cela ressemble à :

SELECT task FROM tasks 

En utilisant l'outil de coupe, vous pouvez obtenir à peu près la même fonctionnalité :

cut -d':' -f1 tasks 

L'option d spécifie un délimiteur, le caractère qui sépare les champs sur chaque ligne de votre fichier. L'option f vous permet de choisir des champs particuliers. Cela vous donnera une liste simple de toutes les tâches de votre base de données :

Sélectionnez les lignes avec grep ou awk

Plutôt que de récupérer chaque ligne de votre base de données, vous souhaiterez généralement restreindre les résultats. Le filtrage basé sur les valeurs des champs est l'exigence la plus évidente, comme dans :

SELECT * FROM tasks WHERE status=open 

Dans ce cas, grep est le substitut parfait. Utilisez-le pour faire correspondre les lignes selon un modèle regex et vous pourrez trouver, par exemple, chaque tâche avec un statut « ouvert » :

grep 'open$' tasks 

Ce cas particulier profite du fait que status est le dernier champ de chaque ligne ; $ correspond à la fin d'une chaîne. Pour les champs au milieu d'une ligne, vous devrez peut-être utiliser une expression régulière plus compliquée. Par exemple, obtenir chaque ligne avec une priorité de 2 :

grep ':2:(^:)*$' tasks 

Mais grep ne peut faire correspondre que des modèles de texte, il ne peut pas gérer des expressions plus compliquées comme celle-ci :

SELECT status, task FROM tasks WHERE date<2024-10-21 

Ce SQL utilise une comparaison logique pour obtenir des tâches avant une certaine date. Vous pouvez essayer de construire une expression régulière plus compliquée, mais cela commence à dépasser les capacités de grep.

Ce dont vous avez besoin, c'est d'un outil plus puissant, comme awk :

awk -F':' '$2<"2024-10-21" {print $1 ":" $2 }' tasks 

Awk peut faire le travail à la fois de grep et de cut. Dans cet exemple, la partie qui lit

$2<"2024-10-21" 

Est une condition préalable qui signifie que seules les lignes avec une date antérieure correspondront. La commande imprime ensuite les deux premières colonnes de chaque ligne.

Paginer les résultats avec la queue et la tête

La clause LIMIT de SQL vous permet de récupérer un nombre spécifique de résultats. Pour récupérer les deux premières lignes :

head -2 tasks 

Vous pouvez utiliser tail pour obtenir les n dernières lignes. Avec head, cela vous permet d'approcher la clause LIMIT pour inclure les décalages. Par exemple, pour obtenir les lignes 2 et 3 :

head -3 tasks | tail -2 

Trier les lignes avec tri

La clause « ORDER BY » constitue une partie importante de nombreuses instructions SQL. Heureusement, Linux possède une excellente commande équivalente : sort. Comme cut et awk, vous pouvez spécifier un délimiteur et un champ par numéro, bien que les indicateurs utilisent des lettres différentes. Cette fois, t précise le délimiteur et k le numéro du champ :

sort -t':' -k2 tasks 

Cela affichera tous les enregistrements triés par date :

Rejoindre des tables avec jointure

Les bases de données relationnelles concernent toutes les relations entre différentes tables, où un champ dans l'une fait référence à un champ dans une autre. Vous ne le savez peut-être pas, mais Linux a un équivalent à la clause JOIN de SQL appelée, sans surprise, join.

Étendons les données de tâches pour répondre aux tâches de plusieurs personnes. Commencez par ajouter une nouvelle colonne de nom au fichier de tâches d'origine afin qu'elle ressemble à ceci :

Et créez un fichier, personnes, pour stocker les détails de chaque personne pour laquelle nous stockerons les tâches :

Vous pouvez maintenant utiliser la commande join avec un délimiteur spécifié via l'option t :

join -t':' -1 5 -2 1 tasks people 

Les options -1 et -2 spécifient le numéro du champ à joindre à partir de chaque fichier. Ici, ils sont respectivement le 5ème et le 1er field. join utilisera le premier champ par défaut, vous pouvez donc simplifier cela comme suit :

join -t':' -1 5 tasks people 

Et cela produira :

Pour nettoyer un peu la sortie, vous pouvez diriger vos tables jointes pour couper et omettre le champ de nom :

join -t':' -1 5 tasks people | cut -d':' -f2- 

Et vous pouvez combiner les deux noms en un seul en utilisant awk :

join -t':' -1 5 tasks people | awk -F':' '{print $2":"$3":"$4":"$5":"$6" "$7}' 

Tout mettre ensemble

Pour conclure, considérons une expression SQL beaucoup plus compliquée. En voici une qui joint les deux tables pour obtenir des noms, sélectionne des colonnes spécifiques et récupère les lignes avec une certaine priorité. Il trie par date et termine en récupérant uniquement la première ligne correspondante :

SELECT task,date,priority,status,first_name,last_name
FROM tasks t
LEFT JOIN people p ON t.name=p.name
WHERE priority=2
ORDER BY date
LIMIT 1

Le pipeline de commandes équivalent est peut-être plus délicat à comprendre, mais ce n'est pas plus compliqué une fois que vous êtes familiarisé avec ces outils de base :

join -t':' -1 5 -2 1 tasks people 
  | awk -F':' '{print $2":"$3":"$4":"$5":"$6" "$7}'
  | grep ':2:'
  | sort -t ':' -k2
  | head -1

★★★★★