• Assurez la sécurité des applications de la bonne manière! Détectez, protégez, surveillez, accélérez et plus encore…
  • grep, développé à l'origine pour les systèmes basés sur Unix, est l'un des utilitaires de ligne de commande les plus utilisés sous Linux.

    Son nom vient d'une autre commande similaire dans ed tool, c'est-à-dire g / re / p qui signifie grechercher lobalement un reexpression gulaire et pRint des lignes correspondantes. grep recherche essentiellement un modèle ou une expression régulière donné à partir d'une entrée ou d'un fichier standard et imprime les lignes qui correspondent aux critères donnés. Il est souvent utilisé pour filtrer les détails inutiles tout en imprimant uniquement les informations requises à partir de gros fichiers journaux.

    La puissance de expression régulière combiné avec les options prises en charge dans grep rend cela possible.

    Ici, nous allons couvrir certaines des commandes grep couramment utilisées dans différents scénarios par sysadmin ou développeur.

    Alors commençons… 👨‍💻

    Syntaxe de la commande grep

    La commande grep attend un modèle et des arguments facultatifs avec une liste de fichiers si elle est utilisée sans tuyauterie.

    $ grep [options] pattern [files]

    Un exemple simple est:

    $ grep my file.txt
    my_file
    $

    Recherche de plusieurs fichiers

    grep vous permet de rechercher le modèle donné non seulement dans un mais plusieurs fichiers. Voici comment rechercher un modèle dans plusieurs fichiers en utilisant * joker.

    $ sudo grep -i err /var/log/messages*

    Sortie :

    $ sudo grep err /var/log/messages*
    /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
    /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
    /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
    /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
    /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
    /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
    /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
    /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
    /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
    /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
    /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
    /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
    /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
    /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
    /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
    /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
    /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
    /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
    $

    Vous pouvez observer à partir de la sortie ci-dessus que le nom de fichier est imprimé en premier avant d'imprimer la ligne correspondante pour indiquer où grep trouvé le modèle donné.

    Recherche insensible à la casse

    grep propose de rechercher un motif sans regarder le cas du motif. Utilisation -i flag pour dire à grep d'ignorer la casse.

    $ grep -i [pattern] [file]

    Sortie :

    $ grep -i it text_file.txt
    This is a sample text file. It contains
    functionality. You can always use grep with any
    kind of data but it works best with text data.
    It supports numbers like 1, 2, 3 etc. as well as
    This is a sample text file. It's repeated two times.
    $

    Recherche de mots entiers

    Ce n'est pas toujours que nous voulons une correspondance partielle, mais plutôt que grep ne correspond qu'à un mot complet. Vous pouvez le faire avec -w drapeau.

    $ grep -w [pattern] [file]

    Sortie :

    $ grep -w is text_file.txt
    This is a sample text file. It contains
    This is a sample text file. It's repeated two times.
    $

    Vérifier le nombre de correspondances

    Parfois, au lieu de la ligne correspondante, nous avons juste besoin du nombre de correspondances réussies effectuées par grep. Nous pouvons obtenir ce décompte en utilisant -c option.

    $ grep -c [pattern] [file]

    Sortie :

    $ grep -c is text_file.txt
    2
    $

    Rechercher dans les sous-répertoires

    Il est souvent nécessaire de rechercher des fichiers non seulement dans le répertoire de travail actuel, mais également dans les sous-répertoires. grep vous permet de le faire facilement avec -r drapeau.

    $ grep -r [pattern] *

    Sortie :

    $ grep -r Hello *
    dir1/file1.txt:Hello One
    dir1/file2.txt:Hello Two
    dir1/file3.txt:Hello Three
    $

    Comme vous pouvez l'observer, grep parcourt chaque sous-répertoire dans un répertoire courant et répertorie les fichiers et les lignes où une correspondance est trouvée.

    Recherche inversée

    Si vous voulez trouver quelque chose qui ne correspond pas à un modèle donné, grep permet de le faire avec -v drapeau.

    $ grep -v [pattern] [file]

    Sortie :

    $ grep This text_file.txt
    This is a sample text file. It contains
    This is a sample text file. It's repeated two times.
    $ grep -v This text_file.txt
    several lines to be used as part of testing grep
    functionality. You can always use grep with any
    kind of data but it works best with text data.
    It supports numbers like 1, 2, 3 etc. as well as
    alphabets and special characters like - + * # etc.
    $

    Vous pouvez comparer la sortie de grep commande sur le même modèle et fichier avec et sans -v drapeau. Avec -v, les lignes qui ne correspondent pas au motif sont imprimées.

    Imprimer les numéros de ligne

    grep vous permet d'imprimer les numéros de ligne avec les lignes imprimées, ce qui permet de savoir facilement où se trouve la ligne dans le fichier. Utilisation -n comme indiqué pour obtenir les numéros de ligne en sortie.

    $ grep -n [pattern] [file]

    Sortie :

    $ grep -n This text_file.txt
    1:This is a sample text file. It contains
    7:This is a sample text file. It's repeated two times.
    $

    Limiter la sortie grep

    Pour les gros fichiers comme les journaux, etc., la sortie de grep peut être longue et vous aurez peut-être juste besoin d'un nombre fixe de lignes dans la sortie au lieu de tout correspondre. On peut utiliser -m[num] pour limiter les lignes imprimées par num. Voici comment l'utiliser:

    $ grep -m[num] [pattern] [file]

    Remarquez comment l'utilisation de -m flag affecte la sortie de grep pour le même ensemble de conditions dans l'exemple ci-dessous:

    $ grep It text_file.txt
    This is a sample text file. It contains
    It supports numbers like 1, 2, 3 etc. as well as
    This is a sample text file. It's repeated two times.
    $ grep -m2 It text_file.txt
    This is a sample text file. It contains
    It supports numbers like 1, 2, 3 etc. as well as
    $

    Afficher les lignes supplémentaires

    Souvent, nous avons besoin non seulement des lignes qui ont un motif correspondant, mais de quelques lignes au-dessus ou en dessous pour un meilleur contexte.

    Il est possible d'imprimer une ligne au-dessus ou au-dessous (ou les deux) d'une ligne ayant un motif en utilisant grep en utilisant -A, -B or -C drapeaux avec num évaluer. Ici num indique le nombre de lignes supplémentaires à imprimer qui est juste au-dessus ou en dessous de la ligne correspondante. Ceci est applicable à toutes les correspondances que grep trouve dans le fichier ou la liste de fichiers spécifié.

    $ grep -A[num] [pattern] [file]

    OR

    $ grep -B[num] [pattern] [file]

    OR

    $ grep -C[num] [pattern] [file]

    La sortie ci-dessous montre une sortie grep normale ainsi qu'une sortie avec indicateur -A, -B et -C un par un. Remarquez comment grep interprète les indicateurs et leurs valeurs et les changements dans la sortie respective. Avec -A1 flag, grep imprime 1 ligne qui suit juste après la ligne correspondante.

    De même, avec -B1 drapeau, il imprime 1 ligne juste avant la ligne correspondante. Avec -C1 drapeau, il imprime 1 ligne qui est avant et après la ligne correspondante.

    $ grep numbers text_file.txt
    It supports numbers like 1, 2, 3 etc. as well as
    $ grep -A1 numbers text_file.txt
    It supports numbers like 1, 2, 3 etc. as well as
    alphabets and special characters like - + * # etc.
    $ grep -B1 numbers text_file.txt
    kind of data but it works best with text data.
    It supports numbers like 1, 2, 3 etc. as well as
    $ grep -C1 numbers text_file.txt
    kind of data but it works best with text data.
    It supports numbers like 1, 2, 3 etc. as well as
    alphabets and special characters like - + * # etc.
    $

    Liste des noms de fichiers

    Pour imprimer uniquement le nom des fichiers dans lesquels un motif est trouvé au lieu des lignes réellement correspondantes, utilisez -l drapeau.

    $ grep -l [pattern] [file]

    Voici un exemple d'exécution:

    $ grep -l su *.txt
    file.txt
    text_file.txt
    $

    Imprimer des lignes exactes

    Parfois, nous devons imprimer des lignes qui correspondent exactement à un motif donné, pas à une partie de celui-ci. grep permet -x drapeau pour faire exactement cela.

    $ grep -x [pattern] [file]

    Dans l'exemple ci-dessous, file.txt contient une ligne avec un seul mot «support» et en tant que tel est mis en correspondance par grep avec -x drapeau tout en ignorant les lignes qui peuvent contenir les mots «support» avec d'autres textes.

    $ grep -x support *.txt
    file.txt:support
    $ 

    Faire correspondre la chaîne de départ

    En utilisant des expressions régulières, nous pouvons trouver une chaîne au début d'une ligne. Voici comment procéder.

    $ grep [options] "^[string]" [file]

    Mise en situation :

    $ grep It text_file.txt
    This is a sample text file. It contains
    It supports numbers like 1, 2, 3 etc. as well as
    This is a sample text file. It's repeated two times.
    $ grep ^It text_file.txt
    It supports numbers like 1, 2, 3 etc. as well as
    $

    Observez comment utiliser ^ caractère change la sortie. ^ indique le début de la chaîne et grep correspond ^It comme n'importe quelle ligne commençant par le mot It. Mettre entre guillemets peut aider lorsque le motif contient des espaces, etc.

    Faire correspondre la chaîne de fin

    Une autre expression régulière utile courante consiste à faire correspondre la fin du motif de ligne.

    $ grep [options] "[string]$" [file]

    Mise en situation :

    $ grep "\." text_file.txt
    This is a sample text file. It contains
    functionality. You can always use grep with any
    kind of data but it works best with text data.
    It supports numbers like 1, 2, 3 etc. as well as
    alphabets and special characters like - + * # etc.
    This is a sample text file. It's repeated two times.
    $ grep "\.$" text_file.txt
    kind of data but it works best with text data.
    alphabets and special characters like - + * # etc.
    This is a sample text file. It's repeated two times.
    $

    Nous avons essayé de faire correspondre un . caractère à la fin de la ligne. Puisque le point (.) Est un caractère à signification spéciale, nous devons l'échapper avec \ personnage. Remarquez à nouveau comment la sortie varie lorsque nous faisons simplement correspondre . caractère et quand nous utilisons $ pour demander à grep de ne rechercher que les lignes qui se terminent par . (pas ceux qui peuvent le contenir n'importe où entre les deux).

    Utiliser le fichier de signatures

    Il peut y avoir des situations où vous avez une liste complexe de modèles que vous utilisez souvent. Au lieu de l'écrire à chaque fois, vous pouvez spécifier une liste de modèles dans un fichier et l'utiliser avec -f drapeau. Le fichier doit contenir un motif par ligne.

    $ grep -f [pattern_file] [file_to_match]

    Dans notre exemple, nous avons créé des noms de fichiers de modèles pattern.txt avec le contenu ci-dessous:

    $ cat pattern.txt
    This
    It
    $

    Pour l'utiliser, utilisez -f drapeau.

    $ grep -f pattern.txt text_file.txt
    This is a sample text file. It contains
    It supports numbers like 1, 2, 3 etc. as well as
    This is a sample text file. It's repeated two times.
    $
    

    Spécifier plusieurs modèles

    grep permet de spécifier plusieurs modèles en utilisant -e drapeau.

    $ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]

    Mise en situation :

    $ grep -e is -e It -e to text_file.txt
    This is a sample text file. It contains
    several lines to be used as part of testing grep
    It supports numbers like 1, 2, 3 etc. as well as
    This is a sample text file. It's repeated two times.
    $

    Spécifier Extended RegEx

    grep prend également en charge les expressions régulières étendues ou ERE en utilisant -E drapeau. Ceci est similaire à egrep commande sous Linux.

    Utiliser ERE présente un avantage lorsque vous voulez traiter les méta-caractères tels quels et que vous ne voulez pas les remplacer par des chaînes comme grep. Cela vous donne plus de flexibilité pour les échapper comme nous sommes obligés de le faire dans le cas de grep. Cela étant dit, en utilisant -E avec grep équivaut à egrep commander.

    $ grep -E '[Extended RegEx]' [file]

    Voici une utilisation de ERE où nous voulons imprimer des lignes qui ne sont pas commentées ou vides. Ceci est particulièrement utile pour trouver quelque chose dans de gros fichiers de configuration. J'ai également utilisé -v drapeau pour ne PAS imprimer les lignes correspondant au motif '^(#|$)'.

    $ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    SyslogFacility AUTHPRIV
    AuthorizedKeysFile      .ssh/authorized_keys
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    GSSAPIAuthentication yes
    GSSAPICleanupCredentials no
    UsePAM yes
    X11Forwarding yes
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    Subsystem       sftp    /usr/libexec/openssh/sftp-server
    $

    Conclusion

    Les exemples ci-dessus ne sont que la pointe de l'iceberg. grep prend en charge une gamme d'options et peut être très outil utile entre les mains d'une personne qui sait comment l'utiliser efficacement. Nous pouvons non seulement utiliser les exemples donnés ci-dessus, mais les combiner de différentes manières pour obtenir ce dont nous avons besoin.

    Reportez-vous à sa page de manuel pour en savoir plus.

    $ man grep

    Ensuite, apprenez Exemples de commandes SFTP.