Chercher une chaine avec awk dans un fichier

sam -  
 sam -
Bonjour,
Mon problème est comme suit :
J'ai un fichier "test" dans lequel je voudrai chercher une chaine exacte entrée par l'utilisateur .
Le fichier test est comme suit :
ch=a.chaine1,b.chaine2
ch1=a.chaine1,b.chaine2
ch2=c.chaine3
ch3=a.chaine4,b.chaine5,chiane6
etc...

Le script doit pouvoir localalisée par ex la chaine "chaine1" ou "chaine3" entrée par l'utilisateur et l'afficher entièrement "a.chaine1" ou encore "c.chaine3".
Si l'utilisateur entre par exemple "chai" le script rend une réponse négative.

Merci d'avance
Configuration: Windows XP
Internet Explorer 7.0

25 réponses

  • 1
  • 2
  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    root@debian:~# cat fic
    ch=a.chaine1,b.chaine2
    ch1=a.chaine1,b.chaine2
    ch2=c.chaine3
    ch3=a.chaine4,b.chaine5,chiane6
    etc...
    
    root@debian:~# cat ccm.pl
    #!/usr/bin/perl
    use strict;use warnings;
    
    my %h;
    print "Entrez la chaine à chercher : ";
    chomp(my $ch = <STDIN>);
    
    while(<>){
      next unless /(\w*\.*$ch)/;
      $h{$1}++;
    }
    print keys %h," trouvé ",values %h," fois\n";
    __END__
    root@debian:~# perl ccm.pl fic
    Entrez la chaine à chercher : chaine1
    a.chaine1 trouvé 2 fois
    root@debian:~#
    
    2
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Pourquoi avec "awk" ? Un simple "grep" devrait suffire, non ?
    La recherche doit renvoyer que la chaine de caractères (avec les 2 caractère précédents) ou la ligne entière ?
    1
  3. sam
     
    Comment faire alors?
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Ca dépend...

      Tu n'as pas répondu !!!

      La recherche doit renvoyer que la chaine de caractères (avec les 2 caractère précédents) ou la ligne entière ?
      0
  4. sam
     
    Le grep ne doit faire ressortir que "a.chaine1" ou "c.chaine3" etc et non pas la ligne entière.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
     grep -o ".\.chaine3" fichier
     grep -o ".\.chaine3" fichier
    Et en application :
    ssh$ cat plop
    ch=a.chaine1,b.chaine2
    ch1=a.chaine1,b.chaine2
    ch2=c.chaine3
    ch3=a.chaine4,b.chaine5,chiane6
    
    ssh$ var="chaine3"
    
    ssh$  grep -o ".\.${var}" plop
    c.chaine3
    ;-))
    0
  7. sam
     
    Le grep -o n'existe pas sur aix :(
    il n'y a que le grep -w mais qui retourne l'ensemble de la ligne :(
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    voilà, mais ce n'est pas efficace tant qu'on ne connais pas exactement la structure complète de ton fichier

    la chaîne à récupérée a toujours le format
    LETRRE.chaineNUMERO ?!

    root@debian:~# cat fic
    ch=a.chaine1,b.chaine2
    ch1=a.chaine1,b.chaine2
    ch2=c.chaine3
    ch3=a.chaine4,b.chaine5,chiane6
    etc...
    
    root@debian:~# grep -Eo '[a-zA-Z]\.chaine1' fic
    a.chaine1
    a.chaine1
    root@debian:~#
    0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Le grep -o n'existe pas sur aix :(
    et avec perl ça te vas?
    0
  10. sam
     
    Je suis désolé mais ça ne marche pas.
    Voici le résultat d'execution sur le fichier fic :
    grep -E "[a-zA-Z]\.chaine1" fic
    résultat :
    ch=a.chaine1,b.chaine2
    ch1=a.chaine1,b.chaine2

    Le paramètre "o" n'existe pas pour grep sur aix
    0
  11. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    et ça?
    perl -ne 'print $1,"\n" if /=(\w*\.\w+1),/' fic
    --

    lami20j
    0
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ben désolé, tu ne l'avais pas spécifié aussi...

    En plus je me suis aperçu qu'il manquait le paramètre "\b" à l'expression pour quelle soit exacte :
    grep -o ".\.chaine3\b" fichier
    Essaye avec "perl" alors comme suggéré par" lami20j".

    ;-))
    0
  13. sam
     
    Mais elle est où ma variable sur laquelle je vais effectuer ma recherche???
    0
  14. sam
     
    Pour l'instruction perl, elle ne répond pas à ma question dans la mesure où elle délimite la chaine à rechercher avec "=" et "," alors qu'il y a d'autres chaine qui sont délimitées par "=" et la fin de la ligne. En plus elle affiche le premier paramètre $1!!!
    0
  15. sam
     
    mon fichier c'est exactement ce que je vous ai lister :

    ch=a.chaine1,b.chaine2
    ch1=a.chaine1,b.chaine8
    ch2=c.chaine3
    ch3=a.chaine4,b.chaine5,chiane6
    ch4=a.chaine4,b.chaine8,chiane9

    en changeant juste les noms c tout!
    0
  16. sam
     
    Merci lami20j :)
    le script marche bien. Cependant, je voudrais faire appel à ce script perl à partir de mon script korn shell et pour ce je voudrai une valeur de retour pour savoir si l'élément entré par l'utilisateur a été trouvé ou non.
    Comment faire sachant bien que je ne connais pas perl du tout :(
    0
  17. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    par exemple
    root@debian:~# cat ccm.sh
    #!/bin/sh
    
    perl /home/lami20j/ccm.pl $1
    root@debian:~# sh ccm.sh fic
    Entrez la chaine à chercher : chaine1
    a.chaine1 trouvé 2 fois
    root@debian:~#
    0
  18. sam
     
    Non, c pas l'appel du script shell! ça je sais faire :)
    Je voudrai la valeur de retour à savoir "a.chaine1".
    0
  19. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    mets tu as la valeur de retour

    a.chaine1 trouvé 2 fois
    0
  20. sam
     
    Moi ce que je veux c intercepter cette valeur. çàd que lorsque je ferai appel à mon script perl il va me retourner "a.chaine1 trouvé 2 fois " mais moi je veux que ça soit dans une variable que je testerai au niveau de mon script ksh.
    Exemple:

    # cat ccm.sh
    #!/bin/sh

    perl /home/lami20j/ccm.pl $1
    si "valeur de retour" = null alors
    "traitement"
    sinon
    "traitement
    fin si
    0
  • 1
  • 2