IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Grep sur un mot


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Par défaut Grep sur un mot
    Bonjour,

    J'utilise souvent la commande grep pour rechercher des éléments dans un fichier.
    Je l'utilise le plus souvent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     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 affciher 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

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Phrase="Voici ma super phrase test :)"
    Mot="super"
    grep -o "${Mot}" <<< "${Phrase}"
    renvoie bien que le mot voulu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Phrase="Je n’ai rien contre les étrangers. Le problème, c’est que d’une part, ils parlent pas français pour la plupart... Et selon le pays où on va, ils parlent pas le même étranger."
    Mot="français"
    grep -o "[^ ]* [^ ]* [^ ]* ${Mot} [^ ]* [^ ]* [^ ]* " <<< "${Phrase}"
    renvoie
    ils parlent pas français pour la plupart...

    Mais attention ma façon de faire ne fonctionne que s'il y a bien le nombre de mot de chaque côté.

    Après il faut se lancer dans les expressions régulières.

    avec une expression, c'est plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Eo "([^ ]* ){3}${Mot} ([^ ]* ){3}" <<< "${Phrase}"
    mais toujours le souci du nombre de mot obligatoire...

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    Déjà, faudrait donner la définition que tu as d'un "mot"...

    Ensuite, pour les 10 mots avant et après, est-ce qu'ils doivent être sur la même ligne ou faut-il aussi prendre ceux des lignes précédentes et suivantes jusqu'à ce que ça fasse le compte ?

    PS: si l'otpion -A et -B on la même valeur, alors tu peux les remplacer par l'option -C , par exemple: grep -A 10 -B 10 ... c'est équivalent à grep -C 10 .... .

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Perso je suis parti du principe que c'était sur la même ligne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Eo "([^ ]* )?([^ ]* )?([^ ]* )?${Mot} ([^ ]* )?([^ ]* )?([^ ]* )?" <<< "${Phrase}"
    Plus de problème si les mots n'existent pas autour.
    mais il y a sûrement moyen de de regrouper les ([^ ]* )?

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Je l'utilise le plus souvent grep "motif" -A 10 -B 10
    Même réaction que disedorgue. L'option adéquate est "-C 10".

    J'aimerais grep et n'afficher que le mot grep dans un premier temps.
    Il faut utiliser les balises de début-de-mot et de fin-de-mot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "\<${Mot}\>" fichier
    Si tu n'utilises pas cette syntaxe, lorsque tu cherches "ami", il ne garde pas que "ami" mais aussi "amitié" ou "pastrami".
    Ou alors ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "\b${Mot}\b" fichier
    J'aimerais grep et n'afficher que le mot grep
    Connais-tu l'option "-o" qui n'extrait que la part de la ligne qui correspond à ta regex ?

    Ensuite j'aimerais affciher les 10 mots qui précèdent et qui suivent
    grep travaille sur les lignes. Sans doute préféreras-tu utiliser awk pour traiter mot par mot.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    ce serait plus clair avec le fichier à traiter, la sortie correspondante attendue, et l'explication contextuelle !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Juste pour le fun, en fullbash :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    echo "Je vais faire une longue phrase
    inutile et complètement bidon
    mais il peut être très pratique
    pour régler le problème actuel" > fichier_test
     
    Word="bidon" # mot recherché
     
    x=5 # 5 mots avant et après
     
    WordList=($(< fichier_test)) # Contenu d'un fichier ou d'une variable
     
    for Number in ${!WordList[@]}
    do
      [[ ${WordList[${Number}]} == ${Word} ]] && { echo "${WordList[@]:$((${Number} - ${x})):$((${x} * 2 + 1))}"; break; }
    done
    bon la ponctuation nous plombe si elle est entourée d'espace comme ? ou !
    mais sinon c'est plutôt fonctionnel (pas sûr que ce soit très rapide sur les gros fichiers...)

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    idem, avec des morceaux de Python (pour la praticité, notamment traitement des espaces [:punct:] et [:space:] via module regex et le slicing bien arrangeant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import regex
     
    word = u'bidon'
    x = 5
    s = """Je vais faire une longue phrase
    inutile et complètement bidon
    mais il peut être très pratique
    pour régler le problème actuel
    ...et je vais même, avec l'élan d'un gnou au galop, y rajouter de la ponctuation !!!"""
     
    wordlist = regex.split(r'[[:punct:][:space:]]+', s) # tokenisation du pauvre
    print(u' '.join(wordlist[wordlist.index(word) - x : wordlist.index(word) + x +1]))
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    longue phrase inutile et complètement bidon mais il peut être très

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk -vmot=bidon 'BEGIN{RS="[^a-zA-Z0-9àéèêôîâûç]";} /./{ind++;a[ind]=$0;} END{for (m in a) if (a[m]==mot) for (i=m-5;i<=m+5;i++) printf("%s%s",a[i],(i==m+5)?"\n":(i>0)?" ":"");}' fichier_test
    longue phrase inutile et complètement bidon mais il peut être très
    $ awk -vmot=Je 'BEGIN{RS="[^a-zA-Z0-9àéèêôîâûç]";} /./{ind++;a[ind]=$0;} END{for (m in a) if (a[m]==mot) for (i=m-5;i<=m+5;i++) printf("%s%s",a[i],(i==m+5)?"\n":(i>0)?" ":"");}' fichier_test
    Je vais faire une longue phrase

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Pour le fun avec grep :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ echo "$YY"
    Je vais faire une longue phrase
    inutile et complètement bidon
    mais il peut être très pratique
    pour régler le problème actuel
    ...et je vais même, avec lélan dun gnou au galop, y rajouter de la ponctuation !!! -- -- je --
    $ grep -o '[[:alnum:]]*' <<<$YY | grep -i -C 5 'bidon' | xargs | grep -o '[[:alnum:]][[:alnum:] ]*'
    longue phrase inutile et complètement bidon mais il peut être très
    $ grep -o '[[:alnum:]]*' <<<$YY | grep -i -C 5 'je' | xargs | grep -o '[[:alnum:]][[:alnum:] ]*'
    Je vais faire une longue phrase
    régler le problème actuel et je vais même avec lélan dun
    y rajouter de la ponctuation je

Discussions similaires

  1. Grep sur plusieurs mots avec option -v
    Par rinuom dans le forum Linux
    Réponses: 4
    Dernier message: 10/09/2008, 12h02
  2. [JTextPane] Ajouter un évènement souris sur un mot
    Par soad dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 20/03/2007, 15h12
  3. grep sur fichier
    Par vince2005 dans le forum Langage
    Réponses: 15
    Dernier message: 27/03/2006, 15h34
  4. grep sur fichier
    Par vince2005 dans le forum Langage
    Réponses: 1
    Dernier message: 15/03/2006, 13h21
  5. Condition sur un mot
    Par le mage tophinus dans le forum Linux
    Réponses: 8
    Dernier message: 03/06/2005, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo