6 utilisations de filtrage du texte pour la commande Linux AWK
La commande awk est un outil polyvalent de traitement du texte dans Linux. Il filtre et manipule les fichiers à l'aide de modèles, de conditions et d'actions. Il prend en charge une large gamme de scénarios, ce qui rend simple d'extraire des données spécifiques des journaux, des fichiers de configuration ou de tout fichier texte.
Voici quelques façons courantes de filtrer le texte avec awk. Ils comprennent des recherches d'expression régulières, une sélection de lignes et de champs, un filtrage numérique, et plus encore.
Sommaire
Faire correspondre le texte en utilisant des expressions régulières
Bien que Regex ait une courbe d'apprentissage notoirement abrupte, c'est le couteau suisse de la manipulation du texte. Lorsque vous l'utilisez avec des outils comme AWK, vous pouvez rechercher des modèles, de simple à complexe, sur des fichiers entiers en millisecondes.
Commençons par la syntaxe de base:
awk '/pattern/ {print}' filename`
Les slashes avant disent à AWK que vous utilisez une expression régulière, et les accolades bouclées contiennent l'action à effectuer sur une correspondance. Par exemple, vous pouvez imprimer toutes les entrées de journal contenant « Erreur » à partir d'un fichier de journal avec ceci:
awk '/error/ {print}' syslog.log
Cette lignée saisit chaque ligne contenant le mot erreur, mais Regex vous permet d'aller plus loin. Par exemple, pour trouver des lignes en commençant par des informations ou avertissez, utilisez cette commande:
awk '/^(INFO|WARN)/ {print}' syslog.log
Ici, le tuyau | agit comme un ou opérateur, et le caret ^ correspond au début d'une ligne.
Ce que j'aime chez Regex, c'est qu'il va au-delà des mots exacts, vous permettant d'utiliser les caractères génériques pour des recherches plus complexes. Par exemple, vous pouvez trouver des adresses e-mail dans un fichier texte avec ce modèle:
awk '/(a-zA-Z0-9)+@(a-zA-Z0-9)+.(a-zA-Z)+/ {print}' contacts.txt
Ce modèle correspond aux séquences de lettres et de nombres, suivies d'un @ symbole, de plus de lettres et de chiffres, d'un point et enfin plus de lettres. Bien qu'il ne soit pas parfait pour chaque format d'e-mail, il attrape les plus courants.
Vous pouvez également utiliser l'opérateur Tilde (~) pour une correspondance plus précise dans des champs spécifiques. Cette approche est très efficace pour les données structurées. Par exemple, si vous souhaitez rechercher des erreurs uniquement dans le troisième champ de chaque ligne, vous pouvez l'utiliser:
awk '$3 ~ /ERROR/ {print}' system.log
Cette approche le rend plus précis que la recherche de toute la ligne. De plus, si la sensibilité à la caisse est un problème, utilisez simplement la fonction Tolower () comme ceci:
awk 'tolower($0) ~ /error/ {print}' mixed_case.log
Cette commande convertit chaque ligne en minuscules avant de rechercher, ce qui lui permet de capturer l'erreur, l'erreur, l'erreur et toute autre capitalisation.
Sélectionnez des lignes par numéro de ligne, longueur, nombre de champs ou dernier champ
Parfois, vous avez besoin de lignes spécifiques en fonction de leur position ou de leurs caractéristiques, pas de leur contenu. Awk gère magnifiquement ces scénarios avec ses variables intégrées qui filtrent les lignes par position ou structure. Ces variables intégrées incluent NR, Longueur (), NF et $ NF.
Commençons par la variable NR. Il signifie Nombre d'enregistrements (ou, simplement numéro de ligne). Awk l'incrémente pour chaque ligne qu'il lit. Vous pouvez l'utiliser pour saisir des lignes ou des gammes spécifiques.
Pour afficher les 10 premières lignes d'un fichier, utilisez:
awk 'NR <=10 {print}' largefile.txt
De même, pour obtenir toutes les lignes uniformes, utilisez 2:
awk 'NR % 2 == 0 {print}' file.txt
Pour les gammes, vous pouvez combiner plusieurs conditions NR avec l'opérateur &&, comme ceci:
awk 'NR >= 50 && NR <= 100 {print}' file.txt
Cela imprime les lignes de 50 à 100. Vous pouvez également combiner la fonction Longueur () avec AWK lorsque vous traitez avec des fichiers qui ont un formatage incohérent ou lorsque vous souhaitez filtrer les lignes vides.
Par exemple, pour compter les caractères avec la fonction LONGTES () puis afficher uniquement des lignes de plus de 80 caractères, utilisez:
awk 'length($0) > 80 {print}' code.py
Maintenant, parlons d'une autre variable couramment utilisée, NF, qui fait référence au nombre de champs. En utilisant cette variable, AWK divise automatiquement chaque ligne dans des champs en fonction d'un délimiteur (par défaut, des espaces ou des onglets).
Par exemple, pour les fichiers CSV ou les données structurées, vous pouvez utiliser la variable NF pour compter les champs (colonnes). Vous pouvez filtrer en fonction du nombre de champs que chaque ligne contient:
awk 'NF == 5 {print}' customer_data.csv
Cela ne conserve que des lignes avec exactement 5 champs, vous aidant à repérer des enregistrements incomplets. Pour faire le contraire et imprimer uniquement les lignes qui n'ont pas exactement 5 champs, utilisez l'opérateur! = Au lieu de ==. De plus, pour imprimer des lignes avec au moins 5 champs (colonnes), utilisez l'opérateur> =.
Alors que NF vous indique combien de champs il y a, $ nf vous donne la valeur du tout dernier champ. La variable $ NF représente le dernier champ de chaque ligne, quel que soit le nombre de champs. Ceci est incroyablement utile lors de la gestion des fichiers où le nombre de colonnes varie.
Prenez cette commande:
awk '$NF == "COMPLETED" {print}' task_list.txt
Cela trouve toutes les lignes se terminant avec terminées, même si certaines lignes ont 3 champs et d'autres en ont 7.
Vous pouvez également combiner toutes ces conditions ensemble:
awk 'length($0) > 50 && NF >= 4 {print}' mixed_data.txt
Cette commande imprime uniquement les lignes de plus de 50 caractères et contiennent au moins 4 champs. Il garantit que la sortie exclut les lignes courtes ou incomplètes.
Comparez et filtrez les valeurs de champ numérique
AWK est assez intelligent pour traiter les champs contenant des nombres comme des nombres réels, pas seulement du texte. Cela signifie que vous pouvez effectuer des comparaisons mathématiques sans aucune fonction de conversion spéciale, ouvrant un tout nouveau monde de possibilités de filtrage.
Maintenant, disons que vous avez un CSV des scores des étudiants, et que vous voulez ne retourner que les étudiants qui ont marqué au-dessus de 80 points. Vous pouvez le faire avec:
awk -F, '$2 > 80 {print $1, $2}' scores.csv
Ici, nous utilisons -f, pour dire que les champs sont séparés par des virgules. 2 $ se réfère au deuxième champ ou à la colonne (le score), et 1 $ est le nom.
Lorsque vous travaillez avec des fichiers texte, les pourcentages peuvent entraîner des problèmes si le symbole% est inclus dans un champ. Vous pouvez le supprimer avec gsub ():
awk '{gsub(/%/, "", $4); if($4 > 75) print}' performance.txt
Cette commande supprime le symbole% du quatrième champ, puis vérifie si le nombre restant dépasse 75.
Vous pouvez également utiliser plusieurs conditions avec des opérateurs logiques. Par exemple, si vous souhaitez extraire les valeurs de vente d'un fichier CSV entre 500 $ et 2000 $, exécutez:
awk -F, '$3 > 500 && $3 < 2000 {print}' sales.csv
Vous pouvez combiner des conditions avec le || (Ou) l'opérateur également. Par exemple, pour trouver des enregistrements où les ventes sont très élevées ou très faibles, utilisez:
awk -F, '$3 > 5000 || $3 < 100 {print}' sales.csv
Au-delà des comparaisons numériques, vous pouvez également utiliser plusieurs conditions pour faire correspondre le texte spécifique, vérifier les dates ou exclure des enregistrements indésirables.
Vous pouvez également combiner && et ||. Cependant, les parenthèses sont essentielles pour contrôler correctement la logique. Supposons que vous souhaitiez trouver des comptes actifs ou en attente, mais uniquement si leur solde dépasse 1000 $. Vous écririez:
awk -F, '($2 == "ACTIVE" || $2 == "PENDING") && $3 > 1000' accounts.csv
Sans parenthèses, la priorité de l'opérateur changerait la signification du filtre.
Capture des plages de lignes entre les modèles de correspondance
La plupart des utilisateurs de Linux connaissent l'utilisation de Grep pour capturer des informations spécifiques. Cependant, AWK peut également sélectionner une gamme de lignes, en commençant à partir d'une ligne qui correspond à un start_pattern et se terminant par une ligne qui correspond à un end_pattern.
La syntaxe est élégamment simple:
awk '/start_pattern/,/end_pattern/' filename
Cela capture la ligne de départ, toutes les lignes entre les deux et la ligne d'extrémité. Si vous souhaitez exclure les marqueurs eux-mêmes, vous pouvez utiliser une approche basée sur un drapeau comme celle-ci:
awk '/BEGIN/{flag=1; next} /END/{flag=0} flag' logfile.txt
De plus, nous pouvons également capturer des blocs d'erreur complets qui commencent avec du texte spécifié et se terminer avec la ligne vide suivante.
awk '/ERROR:/,/^$/ {print}' application.log
Ici, AWK commencera à imprimer les lignes lorsqu'il verra une ligne contenant « Erreur: » et continuera jusqu'à ce qu'il trouve la première ligne vide.
Exclure les entrées indésirables ou en double
Le nettoyage des données signifie souvent supprimer ce que vous ne voulez pas. AWK fournit des moyens simples de filtrer le bruit et de supprimer les données redondantes.
L'opérateur non (!) Est votre principal outil d'exclusion. Vous pouvez le placer avant n'importe quel modèle ou condition pour inverser le match, disant à AWK d'effectuer une action sur toutes les lignes qui ne correspondent pas.
Par exemple, disons que vous souhaitez exclure tous les messages contenant un débogage de votre fichier journal d'application. Utilisez ceci:
awk '!/DEBUG/' application.log
Cette commande imprime chaque ligne de l'application.log à moins qu'elle ne contient le mot de débogage.
Vous pouvez également combiner cela avec des conditions sur le terrain, comme, vous pouvez afficher tout le trafic qui ne provient pas de votre adresse IP de surveillance interne.
awk '$1 != "10.0.0.5"' access.log
De même, une autre grande opération de AWK consiste à filtrer les commentaires (lignes commençant par #) et les lignes vides à partir d'un fichier de configuration. Pour ce faire, utilisez:
awk '!/^#/ && NF > 0 {print}' config.ini
Cela saute les lignes en commençant par # et supprime également les lignes vides.
Vous pouvez également supprimer des doublons en fonction d'un champ spécifique. Par exemple, considérons que vous avez un fichier CSV Contact_list avec trois colonnes: ID, nom et e-mail. Pour conserver uniquement le premier enregistrement pour chaque adresse e-mail unique (dans le troisième champ), utilisez:
awk '!seen($3)++ {print}' contact_list.csv
De plus, vous pouvez exclure l'exclusion insensible à la cas avec la fonction Tolower ():
Réformer le texte en choisissant des colonnes spécifiques
Les données brutes sont souvent disponibles dans une structure dont vous n'avez pas vraiment besoin, et AWK facilite la réorganisation en quelque chose de plus utile. Vous pouvez choisir des colonnes spécifiques, modifier leur commande ou même les combiner en nouveaux champs.
Par exemple, si vous souhaitez uniquement imprimer les deuxième et cinquième colonnes à partir d'un fichier, vous pouvez utiliser:
awk -F, '{print $2, $5}' sales.csv
Si vous souhaitez modifier l'ordre des colonnes, échangez 5 $ avec 2 $.
Par défaut, AWK sépare la sortie avec des espaces, mais vous pouvez insérer votre propre séparateur tel qu'un symbole de tuyau.
awk '{print $1 "|" $3}' data.txt
Lorsque vous travaillez avec des fichiers CSV, la première ligne est souvent un en-tête. Vous pouvez le sauter avec NR> 1 et réorganiser les colonnes pour afficher l'e-mail suivi du nom.
awk -F, 'NR > 1 {print $3, "->", $1, $2}' contacts.csv
Vous pouvez également combiner des champs pour en créer de nouveaux, tels que rejoindre le premier et le nom de famille dans un nom complet avant d'imprimer l'e-mail.
awk -F, '{print $1 " " $2, $3}' contacts.csv
Enfin, si vous souhaitez que la sortie soit plus claire, vous pouvez ajouter votre propre en-tête avant les données en utilisant un bloc de début.
awk 'BEGIN {print "Name,Email"} {print $1 "," $2}' data.txt
Ces exemples simples sont suffisants pour commencer à reformater le texte dans une disposition qui correspond mieux à vos besoins.
N'oubliez pas que AWK excelle dans le traitement du texte structuré, tout ce qui avec des motifs cohérents ou des séparations de champ. Plus votre format de données est régulier, plus Awk est puissant. Et lorsque vous combinez ces techniques de filtrage avec d'autres outils Linux via des tuyaux, vous créez des workflows de traitement de texte incroyablement efficaces.
