Ces 5 commandes Linux facilitent la lecture de fichiers volumineux
Sommaire
Principaux points à retenir
- Linux fournit des outils pour gérer des fichiers texte volumineux et des flux de données volatils.
- Utilisez « less » pour faire défiler, rechercher et gérer le contenu du fichier, ou pour y diriger directement la sortie.
- Divisez les fichiers volumineux à l'aide de « split », gérez les morceaux efficacement et utilisez « head » et « tail » pour une visualisation sélective.
Si vous avez besoin de rechercher des informations dans des fichiers texte très volumineux, Linux fournit tous les outils dont vous avez besoin, prêts à l'emploi. Vous pouvez également les utiliser sur des flux de texte en direct.
Surcharge d'informations
La plupart du temps, Linux est très discret. Il faut partir du principe que pas de nouvelles, bonnes nouvelles. Si votre dernière commande n'a pas généré de message d'erreur, vous pouvez supposer que tout s'est bien passé.
À d'autres moments, Linux peut vous submerger d'informations. Avant l'introduction de systemd et de journalctl, les outils et techniques que nous allons aborder ici auraient été utilisés pour apprivoiser des fichiers journaux tentaculaires, mais ils peuvent être appliqués à n'importe quel fichier.
Ils peuvent également être appliqués aux flux de données et à la sortie de commandes.
Utiliser moins
La commande less vous permet de faire défiler vers l'avant et vers l'arrière un fichier, une ligne à la fois avec la flèche vers le haut et la flèche vers le bas, ou un écran à la fois avec la page précédente et la page suivante, ou d'accéder au début ou à la fin du fichier avec la touche Accueil et la touche Fin.
less words.txt
Vous pouvez ajouter des numéros de ligne si vous ajoutez l'option de ligne de commande -N (numéros de ligne).
less -N words.txt
Comme vous pouvez le voir, il y a des centaines de milliers de lignes dans ce fichier, mais moins c'est quand même assez rapide, même sur cette machine virtuelle modestement équipée.
Less possède une fonction de recherche pratique. Appuyez sur la barre oblique /, saisissez votre indice de recherche et appuyez sur Entrée. S'il y a une correspondance, less affiche cette section du fichier, avec la correspondance en surbrillance.
Vous pouvez passer d'un match à l'autre en appuyant sur n. Pour faire la même chose en sens inverse, appuyez sur N.
En utilisant des tuyaux, vous pouvez envoyer la sortie d'une commande directement dans less.
sudo ls -R / | less
Tout comme vous le pouvez avec un fichier, vous pouvez faire défiler vers l'avant et vers l'arrière et rechercher des chaînes.
Redirection de flux vers des fichiers
Transférer la sortie d'une commande dans less est idéal pour les besoins ponctuels, mais une fois que vous avez fermé less, la sortie disparaît. Si vous devez travailler avec cette sortie à l'avenir, vous devez en faire une copie permanente et ouvrir la copie dans less.
Cela se fait facilement en redirigeant la sortie de la commande vers un fichier et en ouvrant le fichier avec less.
sudo ls -R / > listing-capture.txt
Notez que les avertissements ou les erreurs sont envoyés à la fenêtre du terminal afin que vous puissiez les voir. S'ils ont été envoyés au fichier, vous risquez de les manquer. Pour lire le fichier, nous l'ouvrons avec less de la manière habituelle.
less listing-capture.txt
L'opérateur > redirige la sortie vers le fichier nommé et crée le fichier à chaque fois. Si vous souhaitez capturer deux (ou plusieurs) ensembles d'informations différents dans le même fichier, vous devez utiliser l'opérateur >> pour ajouter les données au fichier existant.
sudo ls -R /bin > listing-capture.txt
sudo ls -R /etc >> listing-capture.txt
Notez l'utilisation de >> dans la deuxième commande.
less listing-capture.txt
En capturant la sortie d'une commande, nous capturons en fait l'un des trois flux Linux. Une commande peut accepter une entrée (flux 0, STDIN), générer une sortie (flux 1, STDOUT) et générer des messages d'erreur (flux 2, STDERR).
Nous avons capturé le flux 1, le flux de sortie standard. Si vous souhaitez également capturer les messages d'erreur, vous devrez capturer le flux 2, le flux d'erreur standard, en même temps. Nous devons utiliser cette construction étrange 2>&1, qui redirige le flux 2 (STDERR) vers le flux 1 (STDOUT).
sudo ls -R / > listing-capture.txt 2>&1
Vous pouvez rechercher dans le fichier des chaînes telles que avertissement, erreur ou d'autres expressions qui apparaissent dans les messages d'erreur.
less listing-capture.txt
Diviser les fichiers en morceaux plus petits
Si vos fichiers sont si volumineux que less ralentit et devient lent, vous pouvez diviser le fichier d'origine en morceaux plus faciles à gérer.
J'ai un fichier appelé big-file.txt. Il contient 132,8 millions de lignes de texte et sa taille dépasse 2 Go.
L'ouvrir en moins fonctionne assez bien, à moins que vous n'essayiez d'accéder directement au début ou à la fin du fichier, ou que vous n'essayiez d'effectuer des recherches inversées à partir de la fin du fichier.
Ça marche, mais lentement.
C'est pourquoi nous avons la commande split. Comme son nom l'indique, elle divise les fichiers en fichiers plus petits, préservant ainsi le fichier d'origine.
Vous pouvez diviser un fichier en un nombre spécifié de fichiers plus petits, ou vous pouvez spécifier la taille que vous souhaitez pour les fichiers divisés, et le fractionnement détermine le nombre de fichiers à créer. Mais ces stratégies vous laisseront avec des lignes et même des mots répartis sur deux fichiers.
Comme nous travaillons avec du texte et que les lignes séparées et les mots hachés peuvent être problématiques, il est logique de spécifier la séparation par nombre de lignes. Nous avons utilisé la commande wc plus tôt, nous savons donc combien de lignes nous avons.
J'ai utilisé l'option -l (lignes) et spécifié 500 000 lignes. J'ai également utilisé l'option -d (chiffres) pour avoir des fichiers numérotés séquentiellement et l'option -a (longueur du suffixe) pour que les numéros soient complétés par des zéros jusqu'à 3 chiffres. Le mot « chunk. » est le préfixe des noms de fichiers fractionnés.
split -l 500000 -d -a 3 big-file.txt chunk.
Dans notre exemple, cela crée 267 fichiers (numérotés de 000 à 265), fichiers plus faciles à gérer sur des ordinateurs de puissance modeste.
wc chunk.001
wc chunk.002
wc chunk.080
wc chunk.265
Chaque fichier contient 500 000 complet lignes, à part le dernier fichier. Ce fichier contient le nombre de lignes restantes.
Utilisation de la tête et de la queue
Les commandes head et tail vous permettent de consulter une sélection de lignes du haut ou de la fin d'un fichier.
head chunk.199
tail chunk.199
Par défaut, 10 lignes vous sont présentées. Vous pouvez utiliser l'option -n (lignes) pour demander plus ou moins de lignes.
head -n 15 chunk.199
tail -n 3 chunk.199
Si vous connaissez la région d'un fichier qui vous intéresse, vous pouvez sélectionner cette région en acheminant la sortie de la queue vers la tête. Le seul problème est que vous devez spécifier la première ligne de la région que vous souhaitez voir comptée à rebours à partir de la fin du fichier, et non pas à partir du début du fichier.
Le fichier contient 500 000 lignes. Si nous voulons voir 20 lignes à partir de la ligne 1240, nous devons dire à tail de commencer à la ligne 500 000-1239, soit 498 761. Notez que nous soustrayons le nombre inférieur d'un à la ligne à laquelle nous voulons commencer.
La sortie est canalisée vers la tête qui affiche les 20 premières lignes.
tail -n 498761 chunk.199 | head -n 20
En comparant la sortie du même fichier en moins, affiché à partir de la ligne 1240, nous pouvons voir qu'ils correspondent.
Alternativement, vous pouvez diviser le fichier à la première ligne qui vous intéresse, puis utiliser head pour afficher le haut du nouveau fichier.
Une autre astuce que vous pouvez utiliser avec tail est de surveiller les changements de données. Si vous avez un fichier qui est mis à jour comme un fichier journal, l'option -f (suivre les modifications) indique à tail d'afficher le bas du fichier à chaque fois qu'il change.
tail -f changing.log
Filtrage des lignes avec grep
La commande grep est très puissante. L'exemple le plus simple utilise grep pour rechercher des lignes dans un fichier qui contiennent la chaîne de recherche.
grep stereo chunk.045
Nous pouvons ajouter des numéros de ligne avec l'option -n (numéros de ligne) afin de pouvoir localiser ces lignes dans le fichier, si nous le souhaitons. L'option -T (tabulation) permet de tabuler la sortie.
grep -n -T stereo chunk.045
La recherche dans plusieurs fichiers est tout aussi simple.
grep -n -T pamstereogram.1.gz chunk.*
Le nom du fichier et le numéro de ligne sont donnés pour chaque match.
Vous pouvez également utiliser grep pour rechercher dans des flux d’informations en direct.
./log.sh | grep MemAvailable
Plus ils deviennent grands…
Vous pouvez utiliser grep à votre guise et utiliser des expressions régulières dans la chaîne de recherche. Pour toutes les commandes présentées ici, je vous recommande de consulter leurs pages de manuel. Elles font bien plus que ce que j'ai pu aborder ici, et certaines de leurs autres options peuvent être utiles à votre cas d'utilisation particulier.