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 :

Boucle d'un tableau pour un grep


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 28
    Points : 18
    Points
    18
    Par défaut Boucle d'un tableau pour un grep
    Bonjour,

    Je débute en shell et j'aurai besoin d'un coup de main.

    Je voudrai compter combien de fois un élément d'un tableau est trouvé dans une période donnée.

    J'ai commencé par faire une boucle sur compter un élément sur un mois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #Log date
    HD=20140901
     
    while test "$HD" -le "20140930"
     
     
    do
     
    	zgrep -i 'Company1' "$HD"_.log.gz | wc -l >> /tmp/grepcompany
     
    	HD=$[HD+1]
     
    done
    Et ca marche bien
    Resultat obtenu:
    cat /tmp/grepcompany
    0
    2
    6 ...

    Et maintenant j'aimerai que le texte 'company1' soit un tableau comprenant plein de company;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tab_company[0]=company1
    tab_company[1]=company2
    tab_company[2]=company3

    Du coup j'ai fait le code suivant mais ca marche pas

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    HD=20140801
    tab_company[0]=company1
    tab_company[1]=company2
    tab_company[2]=company3
     
    i=0
     
     
    for i in ${tab_company[*]}
     
     
     
    do
     
    	while test "$HD" -le "20140831"
     
     
    	do
    		zgrep -i $tab_company[i] "$HD"_.log.gz | wc -l >> /tmp/grepcompany
     
    		HD=$[HD+1]
     
    	done
     
    	i=i+1
     
    done
    Résultat optimal souhaité:
    Un fichier par company avec le nombre de fois trouvé par jour.
    cat company1
    0
    2
    6...

    cat company2
    5
    2
    7...

    Auriez vous une idée ?

    PS: Comment fait on pour mettre des éléments d'un fichier dans un tableau.
    Mon tableau est égale à /tmp/listcompany et donc j'aimerai consulter ce fichier
    cat /tmp/listcompany
    Company1
    Company2
    Company3


    Merci pour votre aide et commentaires,
    djamat

  2. #2
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Salut,

    Tu as l'air de bien te compliqué la vie pour quelque chose que awk peut faire assez facilement et rapidement

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Bonjour,

    quelque chose que awk peut faire assez facilement et rapidement
    avec des fichiers compressés ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    ok mais malheuresement je suis pas un spécialiste du awk

    J'ai check sur internet et à première vue http://www.shellunix.com/awk.html le .gz n'est pas géré.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour,

    la réponse semble simple:
    Ce n'est pas comme ça qu'on accède à un élément de tableau. Vérifie-le dans n'importe quel tutoriel ou ouvrage de référence:
    [edit] Pardon, j'ai sauté ta deuxième question. Pour y répondre, tape:
    ou intéresse-toi à
    [/edit]
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour,

    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    avec des fichiers compressés ?
    Pourquoi pas, un exemple de code (bon ici, on lui demande d'afficher le deuxième champs des fichiers que l'on donne en paramètre):
    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
    16
    17
    18
    19
    20
    21
    $ cat file_gzip.awk 
    BEGIN{
     X=1
     FL=ARGV[1]
     ARGV[1]="/tmp/tmp.awk.txt"
     system("gzip -d -c " FL ">/tmp/tmp.awk.txt")
    }
    {
     print $2
    }
    ENDFILE{
     X++
     if (ARGV[X]) {
      FL=ARGV[X]
      ARGV[X]="/tmp/tmp.awk.txt"
      system("gzip -d -c " FL ">/tmp/tmp.awk.txt")
     }
    }
    END{
     system("rm /tmp/tmp.awk.txt")
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ file file_gzip.txt.gz 
    file_gzip.txt.gz: gzip compressed data, was "file_gzip.txt", last modified: Wed Oct  1 23:39:14 2014, from Unix
    $ zcat file_gzip.txt.gz 
    ligne1:champs1_2
    ligne2:champs2_2
    ligne3:champs3_2
    ligne4:champs4_2
    ligne5:champs5_2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ awk -F\: -f file_gzip.awk file_gzip.txt.gz 
    champs1_2
    champs2_2
    champs3_2
    champs4_2
    champs5_2
    Cordialement.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HD=20140801
    tab_company[0]=company1
    tab_company[1]=company2
    tab_company[2]=company3
     
    i=0
     
    for i in ${tab_company[*]}
    Faut choisir!
    Soit i est un entier (l'index du tableau i=0 puis incrément (mais va falloir faire mieux que "i=i+1"!!))
    Soit i est un élément du tableau énuméré par le "for"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do
    	while test "$HD" -le "20140831"
    	do
    		zgrep -i $tab_company[i] "$HD"_.log.gz | wc -l >> /tmp/grepcompany
    Si i est un entier, tu veux probablement utiliser sa valeur "$i" et non son nom "i"!

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Merci pour vos réponses et pour le retour tardive mais bien occupé
    Mais cet aprem je m'occupe de ceci.


    Explication:
    En faite je pense que je me complique la vie, car ce que j'ai besoin c'est à partir d'un fichier X composé d’élément Y savoir combien de fois l’élément Y est présent dans le fichier Z.

    Fichier X est constitué de la manière suivante:
    company1 (= élément Y)
    company2
    company3

    Fichier Z est un fichier log où la valeur peut varier d'emplacement.

    Résultat souhaité:
    fichiercompany1 avec le nbre de HIT du fichier Z
    fichiercompany2
    fichiercompany3

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par djamat Voir le message
    En faite je pense que je me complique la vie, car ce que j'ai besoin c'est à partir d'un fichier X composé d’élément Y savoir combien de fois l’élément Y est présent dans le fichier Z.
    En fête, oui, tu te compliques la vie!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat fichier_liste
    abc
    def
     
    $ cat fichier_data
    abc def coucou
    abc autre
    def aussi
    abc encore
    abc plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ for cible in $(cat fichier_liste); do echo "$cible: $(fgrep -c "$cible" fichier_data)"; done
    abc: 4
    def: 2

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Merci jack-ft ça fonctionne parfaitement !!

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Ca compte les lignes mais pas les occurrences. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    abc def coucou def abc
    abc autre
    def aussi def
    abc encore
    abc plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for cible in $(cat fichier_liste);do echo "$cible: $(fgrep -o $cible fichier_data |wc -l)";done
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Une autre façon de faire (qui ne grep qu'une fois le fichier de logs):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ while read val str; do echo "${str}:${val}"; done < <(fgrep -o -f fichier_liste fichier_data | sort | uniq -c)
    abc:5
    def:4
    Cordialement.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Ca compte les lignes mais pas les occurrences.
    C'est pas faux!

    Mais, si on va par là (et si on veut chipoter un peu (mais loin de moi cette idée...)), il nous faudrait des spécifications plus précises (pour une fois...).

    Par exemple, combien y a-t-il d'occurrences de "abacab" dans "abacabacabacab"?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "abacabacabacab" | fgrep -c "abacab"
    1
    $ echo "abacabacabacab" | fgrep -o "abacab" | wc -l
           2
    Mon "fgrep -c" n'en voit qu'une alors que ton "fgrep -o" en voit deux et que mon oeil en voit distinctement trois... qui, je l'avoue humblement, ne sont pas complètement disjointes!
    Une en gras, une soulignée et une en italique:
    abacabacabacab

    Comme quoi, le nombre d'occurrences d'une chaîne dans un fichier peut être sujet à diverses interprétations!

    (Au passage, on remarque que l'interpréteur de balises du forum supporte les imbrications non inclusives!)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed ':z;s/abacab\(.*\)/bacab\1\nxxxmotifxxx\n/g;tz' <<<"abacabacabacab"|grep -c "^xxxmotifxxx$"
    3
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    J'avais pensé à peu à la même chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed ':z;s/abacab/\nbacab/;tz;s/[^\n]//g;s/\n/abacab /g' <<<"abacabacabacab" | wc -w
    3
    Mais cela devient tout de suite plus compliqué avec une liste de mots sans être obligé de parser n fois le fichier de données, de plus, sed à le même souci que awk pour la gestion de fichier gzippé...
    Sinon, une version awk (sans gestion du gzip) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat f_list 
    abc
    def
    abacab
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat f_data 
    abc def coucou def abc
    abc autre
    def aussi def
    abc encore
    abc plus
    abacabacabacab
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk 'NR == FNR {Lst[$0]=-1};{for (i in Lst) {X=Y=1;while(X=index(substr($0,Y),i)){Y+=X;Lst[i]+=1}}}END{for (i in Lst) print i ":" Lst[i]}' f_list f_data 
    def:4
    abacab:3
    abc:5
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Explication pour une boucle sur un tableau ( débutant)
    Par serna dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/04/2015, 10h44
  2. boucle for et if pour lecture d'un tableau
    Par DJEcalcul dans le forum MATLAB
    Réponses: 2
    Dernier message: 23/01/2012, 18h10
  3. boucle for n fois pour n tableau...
    Par toyyo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/08/2005, 16h01
  4. Appel d'une fonction dans uns boucle d'un tableau
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/02/2005, 15h37
  5. [VB.NET] Quel objet tableau pour une recherche indexée ???
    Par Kitano dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/09/2004, 09h38

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