Comment correctement grep pour le texte dans les scripts bash

Comment correctement grep pour le texte dans les scripts bash

grep est un utilitaire Linux polyvalent, qui peut prendre quelques années pour bien maîtriser. Même les ingénieurs Linux assaisonnés peuvent commettre l'erreur de supposer qu'un fichier de texte d'entrée donné aura un certain format. grep peut également être utilisé, directement en combinaison avec si Recherches basées pour rechercher la présence d'une chaîne dans un fichier texte donné. Découvrez comment correctement grep pour le texte indépendant des jeux de caractères, comment utiliser le -q Option de texte pour la présence de chaîne, et plus!

Dans ce tutoriel, vous apprendrez:

  • Comment effectuer des recherches de texte indépendantes des caractères correctes avec Grep
  • Comment utiliser les instructions GREP avancées à partir de scripts ou de commandes Terminal Oneliner
  • Comment tester la présence de cordes en utilisant le -q option pour grep
  • Exemples mettant en évidence l'utilisation du grep pour ces cas d'utilisation
Comment correctement grep pour le texte dans les scripts bash

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution Linux
Logiciel Ligne de commande bash, système basé sur Linux
Autre Toute utilité qui n'est pas incluse dans le shell bash par défaut peut être installée en utilisant Sudo Apt-Get Install Utility-Name (ou Installation de miam pour les systèmes basés sur Redhat)
Conventions # - nécessite que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - exige que les commandes Linux soient exécutées en tant qu'utilisateur régulier non privilégié

Exemple 1: Recherches de texte indépendantes des caractères corrects avec grep

Que se passe-t-il lorsque vous grep via un fichier basé sur du texte / des caractères, mais contient des caractères spéciaux en dehors de la plage normale? Cela peut potentiellement se produire lorsque le fichier contient des jeux de caractères complexes ou semble contenir un contenu binaire. Pour mieux comprendre cela, nous devons d'abord comprendre ce qu'est les données binaires.

La plupart (mais pas tous) les ordinateurs utilisent à leur niveau le plus élémentaire seulement deux états: 0 et 1. Peut-être trop simplifié pouvez-vous y penser comme un commutateur: 0 n'est pas une volt, pas de puissance, et 1 est «un certain niveau de tension» ou de mise sous tension. Les ordinateurs modernes sont capables de traiter des millions de ces 0 et 1 dans une fraction de seconde. Cet état de 0/1 est appelé un «bit» et est un système numérique de base-2 (tout comme notre système décimal 0-9 est un système numérique de base-10). Il existe d'autres façons de représenter des données bit / binaires comme octal (8-base: 0-7) et hexadécimal (16-base: 0-F).

Revenant à `` binaire '' (bac, double), vous pouvez commencer à voir comment est couramment utilisé pour décrire tout type de données qui ne peut pas être facilement reconnu par les humains, mais qui peut être compris par les ordinateurs binaires. Ce n'est peut-être pas la meilleure analogie, car le binaire se réfère généralement à deux états (vrai / faux), tandis qu'en commun, le jargon «données binaires» est venu à des données méchantes qui ne sont pas facilement interprétables facilement.

Par exemple, un fichier de code source compilé avec un compilateur contient données binaires principalement illisible par les humains. Par exemple, un fichier de code source compilé avec un compilateur contient données binaires principalement illisible par l'œil humain. Un autre exemple pourrait être un fichier chiffré ou un fichier de configuration écrit dans un format de propriété.

À quoi cela ressemble-t-il lorsque vous essayez de visualiser les données binaires?

Habituellement, lorsque vous affichez des données binaires pour les exécutables, vous verrez de vraies données binaires (tous les caractères étranges - votre ordinateur affiche des données binaires dans les capacités de format de sortie limitées que votre terminal prend en charge), ainsi que des sorties de sortie de texte. Dans le cas d LS Comme vu ici, ils semblent être des noms de fonction dans le LS code.

Pour afficher correctement les données binaires, vous avez vraiment besoin d'une visionneuse de fichiers binaires. Ces téléspectateurs forment simplement les données dans leur format natif, ainsi qu'une colonne latérale basée sur le texte. Cela évite les limites de la sortie textuelle et vous permet de voir le code informatique pour ce qu'il est vraiment: 0 et 1, bien que souvent formaté en formatage hexadécimal (0-F ou 0-F comme indiqué ci-dessous).

Jetons un coup d'œil à deux ensembles de 4 lignes du code binaire de LS Pour voir à quoi cela ressemble:

$ hexdump -c / bin / ls | tête -N4; écho '… '; hexdump -c / bin / ls | Tail -N131 | Tête -N4 00000000 7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00 |.Elfe… | 00000010 03 00 3E 00 01 00 00 00 D0 67 00 00 00 00 00 00 |…>… g… | 00000020 40 00 00 00 00 00 00 00 C0 23 02 00 00 00 00 00 | @… #… | 00000030 00 00 00 00 40 00 38 00 0D 00 40 00 1E 00 1d 00 |… @.8… @… |… 00022300 75 2E 76 65 72 73 69 6F 6E 00 2E 67 6E 75 2E 76 | U.Version… GNU.V | 00022310 65 72 73 69 6F 6E 5F 72 00 2E 72 65 6C 61 2E 64 | Ersion_r….D | 00022320 79 6E 00 2E 72 65 6C 61 2E 70 6C 74 00 2E 69 6E | YN… RelA.plt… in | 00022330 69 74 00 2E 70 6C 74 2E 67 6F 74 00 2E 70 6C 74 | IT… PLT.Got… plt | 


Comment tout cela (en plus d'en savoir plus sur le fonctionnement des ordinateurs) vous aide à comprendre correctement grep usage? Revenons à notre question initiale: que se passe-t-il lorsque vous grep via un fichier basé sur le texte / les caractères, mais contient des caractères spéciaux en dehors de la gamme normale?

Nous pouvons maintenant reformuler à juste titre à «ce qui se passe lorsque vous grep via un fichier binaire»? Votre première réaction peut être: Pourquoi voudrais-je rechercher dans un fichier binaire?. En partie, la réponse montre dans ce qui précède LS Exemple déjà; Souvent, les fichiers binaires contiennent toujours des chaînes de texte.

Et il y a une raison beaucoup plus importante et principale; grep Par défaut supposera que de nombreux fichiers contiennent des données binaires dès qu'ils ont des caractères spéciaux, et peut-être lorsqu'ils contiennent certaines séquences d'échappement binaires, même si le fichier en soi peut être basé sur des données. Ce qui est pire, c'est que par défaut, Grep échouera et interdit la numérisation de ces fichiers dès que ces données sont trouvées:

$ head -n2 test_data.SQL CREATE TABLE T1 (ID INT); Insérer dans les valeurs T1 (1); $ grep 'insert' test_data.SQL | Insérer de la queue -N2 dans les valeurs T1 (1000); Test de fichiers binaires_data.matchs SQL 

Comme deux exemples importants de l'expérience personnelle avec le travail de la base de données, lorsque vous analysez les journaux d'erreur du serveur de base de données, qui peuvent facilement contenir des caractères spéciaux tels que les messages d'erreur, la base de données, la table et les noms de champ peuvent atteindre le journal d'erreur et que ces messages sont régulièrement Dans les jeux de caractères spécifiques à la région.

Un autre exemple est le test SQL obtenu à partir de suites de tests de base de données (illustré dans l'exemple ci-dessus). Ces données contient souvent des caractères spéciaux pour tester et souligner le serveur de plusieurs façons. La même chose s'appliquerait à la plupart des données de test de site Web et d'autres ensembles de données de test de domaine. Comme le Grep échoue par défaut par défaut par rapport à ces données, il est important de nous assurer d'ajouter une option à Grep pour couvrir cela.

L'option est --Files binaires = texte. Nous pouvons voir comment notre Grep fonctionne maintenant correctement:

$ grep 'insert' test_data.SQL | wc -l 7671 $ grep 'insert' test_data.SQL | TAIL -N1 Fichier binaire test_data.SQL correspond à $ grep - binary-files = text 'insert' test_data.SQL | WC -L 690427 

Quelle différence! Vous pouvez imaginer combien de automatises grep Les scripts du monde entier ne parviennent pas à scanner toutes les données qu'ils devraient scanner. Ce qui est pire et aggrave considérablement le problème, c'est que grep Échoue à 100% silencieusement lorsque cela se produit, le code d'erreur sera de 0 (succès) dans les deux cas:

$ grep -q 'insert' test_data.SQL; Echo $? 0 $ grep - binary-files = text -q 'insert' test_data.SQL; Echo $? 0 


Le composant encore plus, le message d'erreur s'affiche sur stdout sortie, et pas sur stderr Comme on pourrait s'y attendre. Nous pouvons le vérifier en redirigeant stderr à l'appareil nul / dev / null, seulement l'affichage stdout sortir. La sortie reste:

$ grep 'insert' test_data.SQL 2> / dev / null | TAIL -N1 Fichier binaire test_data.matchs SQL 

Cela signifie également que si vous deviez rediriger vos résultats GREP vers un autre fichier (> Somefile.SMS Après la commande grep), que le «fichier binaire… correspond» désormais à ce fichier, en plus de manquer toutes les entrées vues après un tel problème s'est produit.

Un autre problème est l'aspect de la sécurité: prenons une organisation qui a scénarisé le journal des greps aux rapports par e-mail à Sysadmins chaque fois qu'un agent voyou (comme un pirate) essaie et accède aux ressources non autorisées. Si un tel pirate est en mesure d'insérer certaines données binaires dans le journal d'accès avant leur tentative d'accès, et le Grep n'est pas protégé par --Files binaires = texte, Aucun e-mail de ce type ne sera jamais envoyé.

Même si le script est développé assez bien pour vérifier le grep Le code de sortie, personne ne remarquera toujours une erreur de script, car Grep renvoie 0, ou en d'autres termes: succès. Succès ce n'est pas si 🙂

Il existe deux solutions faciles; ajouter --Files binaires = texte à tous vos grep déclarations, et vous voudrez peut-être envisager de numériser la sortie Grep (ou le contenu d'un fichier de sortie redirigé) pour le fichier binaire d'expression régulière '^.*allumettes'. Pour plus d'informations sur les expressions régulières, voir Bash Regexps pour les débutants avec des exemples et un bash avancé Regex avec des exemples. Cependant, faire à la fois ou uniquement le premier serait préféré, car la deuxième option n'est pas à l'épreuve du temps; Le texte du «fichier binaire… correspond».

Enfin, notez que lorsqu'un fichier texte est corrompu (défaillance du disque, panne de réseau, etc.), le contenu peut finir par être en texte partielle et en partie binaire. C'est encore une autre raison pour toujours protéger votre grep déclarations avec le --Files binaires = texte option.

Tl; dr: Utiliser --Files binaires = texte Pour tous vos grep déclarations, même si elles fonctionnent actuellement bien. Vous ne savez jamais quand ces données binaires peuvent appuyer sur votre fichier.

Exemple 2: tester la présence d'une chaîne donnée dans un fichier texte

On peut utiliser grep -q en combinaison avec un si Instruction afin de tester la présence d'une chaîne donnée dans un fichier texte:

$ si grep - binary-files = text -qi "insérer" test_data.SQL; puis écho "trouvé!"; else echo" non trouvé!"; fi trouvé! 

Décomposons un peu cela en vérifiant d'abord si les données existent vraiment:

$ grep - binary-files = text -i "insérer" test_data.SQL | têtes -n1 insérer dans les valeurs T1 (1); 

Ici, nous avons laissé tomber le q (silencie) Option pour obtenir la sortie et voir que la chaîne «insérer» - prise de manière insensible à la cas (en spécifiant le -je option de grep existe dans le fichier comme «insérer…».

Notez que le q L'option n'est pas spécifiquement un essai option. C'est plutôt un modificateur de sortie qui raconte grep Pour être «calme», je.e. ne rien sortir. Alors comment le si instruction sachez s'il y a la présence d'une chaîne donnée dans un fichier texte? Cela se fait à travers le grep Code de sortie:

$ grep - binary-files = text -i "insérer" test_data.SQL 2> & 1> / dev / null; Echo $? 0 $ grep - binary-files = text -i "cela n'existe vraiment pas" test_data.SQL 2> & 1> / dev / null; Echo $? 1 


Ici, nous avons fait une redirection manuelle de tous stderr et sdtout sortie à / dev / null en redirigeant stderr (2>) pour stdout (& 1) et rediriger tout stdout Sortie vers le périphérique NULL (> / dev / null). Ceci est fondamentalement équivalent au -q (calme) Option de grep.

Nous avons ensuite vérifié le code de sortie et établi que lorsque la chaîne est trouvée, 0 (succès) est retourné, alors que 1 (défaillance) est renvoyé lorsque la chaîne n'est pas trouvée. si peut utiliser ces deux codes de sortie pour exécuter soit le alors ou la autre Clauses spécifiées.

En résumé, nous pouvons utiliser Si grep -q pour tester la présence d'une certaine chaîne dans un fichier texte. La syntaxe entièrement correcte, comme indiqué plus tôt dans cet article, est Si grep - binary-files = text -qi "search_term" votre_file.SQL pour les recherches insensibles à des cas, et Si grep - binary-files = text -q "search_term" votre_file.SQL Pour les recherches sensibles à la casse.

Conclusion

Dans cet article, nous avons vu les nombreuses raisons pour lesquelles il est important d'utiliser --Files binaires = texte Sur presque toutes les recherches Grep. Nous avons également exploré en utilisant grep -q en combinaison avec si instructions pour tester la présence d'une chaîne donnée dans un fichier texte. Profiter de l'utilisation grep, Et laissez-nous un commentaire avec votre plus grand grep découvertes!

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Gestion de la saisie des utilisateurs dans les scripts bash
  • Masterring Bash Script Loops
  • Comment trouver une chaîne ou un texte dans un fichier sur Linux
  • Utilisez WPSCAN pour scanner WordPress pour les vulnérabilités sur Kali
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Comment récupérer des informations matérielles avec DMIDECODE sur Linux
  • Boucles imbriquées dans les scripts bash
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux