Forum Linux.debian/ubuntu Grep sur un mot

Posté par  . Licence CC By‑SA.
Étiquettes :
2
24
juil.
2018

Bonjour,

J'utilise souvent la commande grep pour rechercher des éléments dans un fichier.
Je l'utilise le plus souvent : grep "motif" -A 10 -B 10 afin d'afficher tous les motifs ainsi que les 10 lignes qui le précède et qui le suivent.

J'aimerais utiliser le même concept mais sur un mot, je m'explique :
J'aimerais grep et n'afficher que le mot grep dans un premier temps.
Ensuite j'aimerais afficher les 10 mots qui précèdent et qui suivent toutes mes occurences de grep. Mais je n'y suis pas parvenu. Est ce que quelqu'un pourrait me donner une piste pour ma commande ?

Cordialement

  • # Piste

    Posté par  (site Web personnel) . Évalué à 4.

    Déjà, -A 10 -B 10, c'est une manière verbeuse d'écrire -C 10 ;-).

    Ce que tu cherches n'existe pas à ma connaissance avec grep, mais tu peux toujours transformer le texte en entrée pour transformer les mots en ligne. Quelque chose comme :

    tr ' ' '\n' <$fichier | grep -C 10 $mot --color=force | tr '\n' ' '
    En remplaçant $mot et $fichier.

  • # Sur la même ligne

    Posté par  . Évalué à 5.

    Si tous les mots sont sur la même ligne, tu peux les matcher avec une regex :

    grep -Eo '([^ ]+ ){10}$mot( [^ ]+){10}' $fichier
    

    (10 suites de caractères non espace, suivies d'un espace, puis $mot, puis 10 espaces suivies d'une suite de caractère non espace)

  • # IFS

    Posté par  . Évalué à 1.

    Bonjour.

    Au risque de dire une grosse couennerie, je crois que tu peux resoudre ton probleme en utilisant la variable d'environnement IFS (Input Field Separator, "\n" par defaut). Ce qui donnerait qqch de cet ordre:

    IFS=" " grep -C 10 <motif> <fichier>

    Probable que ca ne marche pas "out of the box" (p-e plutot IFS="\s" voire "\s+" si c'est supporte), mais a tester.

    ++
    Gi)

    • [^] # Re: IFS

      Posté par  (site Web personnel) . Évalué à 3.

      IFS, c'est un peu plus que \n uniquement. ;)

      $ printf "$IFS"|hd
      00000000  20 09 0a                                          | ..|
      00000003
      

      → Espace, tabulation, et retour à la ligne.

      Cela explique en partie pourquoi les scripts qui changent IFS pour une section de code plutôt que pour juste une commande comme tu le proposais… incluent presque tous une sauvegarde préalable dans une variable souvent nommée OLDIFS, pour recopie ultérieure dans IFS.

      Debian Consultant @ DEBAMAX

    • [^] # Re: IFS

      Posté par  (site Web personnel) . Évalué à 4. Dernière modification le 27/07/18 à 08:26.

      Au risque de dire une grosse couennerie

      Oui ;-).

      Plus sérieusement : $IFS est utilisé par le shell pour délimiter les mots (en particulier dans la construction for v in $values), mais pas par grep.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.