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 :

Pousser le résultat d'un grep dans un tableau


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant en reseaux
    Inscrit en
    Janvier 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Etudiant en reseaux

    Informations forums :
    Inscription : Janvier 2013
    Messages : 35
    Points : 23
    Points
    23
    Par défaut Pousser le résultat d'un grep dans un tableau
    Bonjour à tous,
    je dispose d'un fichier de log, ce fichier n'etant pas forcement agreable à lire je voulais utiliser des expressions reguliere et autre pour le rendre plus lisible

    Example de log:
    Apr 20 11:57:16 radius-XX IN=tun0 OUT=eth1 MAC= SRC=10.10.4.200 DST=216.58.208.206 LEN=52 TOS=00 PREC=0x00 TTL=63 ID=30205 DF PROTO=TCP SPT=40631 DPT=443 SEQ=3881349976 ACK=3943191030 WINDOW=260 ACK URGP=0
    Donc j'aimerai pouvoir récupérer l'adresse ip source, dest et la date, j'ai donc fait comme ceci
    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
     
    #Recuperation ip src
    src=$(cat fichier.txt | awk '{print $8}')
     
    #Recuperation ip dest
    dest=$(cat fichier.txt | awk '{print $9}')
     
     
     
     
    #echo $dest
    echo "Ip sources"
    echo $src | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
     
    echo "Ip Dest"
    echo $dest | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

    Ce qui me retourne

    Ip sources
    10.10.4.200
    10.10.4.200
    10.10.4.200
    10.10.4.200
    10.10.4.200
    10.10.4.200

    Ip Dest
    216.58.208.197
    216.58.208.197
    216.58.208.197
    216.58.208.197
    216.58.208.197
    216.58.208.197
    J'aimerais donc faire correspondre chaque une de ces adresses entre elles (exemple 10.10.4.200 --> 216.58.208.197), donc j'avais pensé enregistrer le resultat de chaque grep dans un tableau puis de faire correspondre chaque une de ces case, mais je ne sais pas comment je pourrais le faire, donc si quelqu'un peut m'aider ?

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    salut,

    ta ligne de log, elle est immense sur une seule ligne ? ou elle a des retour à la ligne ?

    car si elle est que sur une ligne, tu peux lire ton fichier ligne à ligne et parser chaque adresse à chaque ligne et les mettre dans un nouveau fichier, genre séparé par des tab ou point virgule...

    ou alors, tu as awk qui peut te faire ca d'un coup... mais je suis pas assez doué pour te le faire, désolé

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant en reseaux
    Inscrit en
    Janvier 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Etudiant en reseaux

    Informations forums :
    Inscription : Janvier 2013
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    C'est une immense ligne, donc ta solution m’intéresse bstevy tu pourrais détailler un peu comment tu fais pour traiter chaque ligne ?

  4. #4
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Ca doit donner un truc a peu pres comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for cur_file in TonFichierDeLog
     
    src=$(echo $curfile  | awk '{print $8}')
    dest=$(echo $curfile | awk '{print $9}')
     
    echo ${src};${dest}
     
    done

    a mon avis, faut retoucher deux trois endroits, mais dans l'idée, c'est ca. Ca te parle ? ou y'a des trucs que tu comprends pas ?

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Pour manipuler un fichier texte, le conseil est d'utiliser grep, sed, awk, etc et pas un script dans lequel on mettrait un bout de ligne dans un tableau.

    Voici 2 propositions (juste pour s'inspirer):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat /tmp/ipsrc.txt
     Apr 20 11:57:16 radius-XX IN=tun0 OUT=eth1 MAC= SRC=10.10.4.200 DST=216.58.208.206 LEN=52 TOS=00 PREC=0x00 TTL=63 ID=30205 DF PROTO=TCP SPT=40631 DPT=443 SEQ=3881349976 ACK=3943191030 WINDOW=260 ACK URGP=0
    $ sed 's/.* SRC=\(.*\) DST=.*/\1/' /tmp/ipsrc.txt
    10.10.4.200
    $ awk -F'[ =]' '{print $13;}' /tmp/ipsrc.txt
    10.10.4.200
    [edit]
    Et par conséquent: (j'ai enlevé le premier espace, d'où le décalage des champs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk -F'[ =]' '{print $12,$14,$1,$2,$3;}' /tmp/ipsrc.txt
    10.10.4.200 216.58.208.206 Apr 20 11:57:16
    [/edit]
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    on voit ceux qui ont l'habitude d'utiliser awk

    bien joué !
    Moi, je suis pas capable encore de pondre ce genre de truc, je m'entraine pas assez ^^

  7. #7
    Membre à l'essai
    Homme Profil pro
    Etudiant en reseaux
    Inscrit en
    Janvier 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Etudiant en reseaux

    Informations forums :
    Inscription : Janvier 2013
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    Merci pour vos reponses,
    du coup j'ai plutôt suivis la méthode de flodelarab


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cat fichier.txt | while read ligne
    do
    echo $ligne | awk -F'[ =]' '{print $12,$14,$1,$2,$3;}' >> /home/jeremy/fichierlog
     
     
    done
    Cela fonctionne parfaitement, merci,
    question subsidiaire c'est avec le '[ =]' que tu coupe le premier espace ?

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,
    Juste pour le fun, une version sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat llo.txt
    Apr 20 11:57:16 radius-XX IN=tun0 OUT=eth1 MAC= SRC=10.10.4.200 DST=216.58.208.206 LEN=52 TOS=00 PREC=0x00 TTL=63 ID=30205 DF PROTO=TCP SPT=40631 DPT=443 SEQ=3881349976 ACK=3943191030 WINDOW=260 ACK URGP=0
    $ sed -e 's/\(\([^ ]* \)\{3\}\).*SRC=\([^ ]* \).*DST=\([^ ]* \).*/\1;\3;\4/;s/ ;/;/g' llo.txt
    Apr 20 11:57:16;10.10.4.200;216.58.208.206
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    • Le -F précise le séparateur. Avec les crochets, je dis que ce n'est pas un séparateur mais une liste de séparateurs. Et je définis l'espace et le égal. Comme ça je peux avoir le titre et la valeur.
    • L'espace au début est dû à un copier/coller à l'arrache. Mais du coup, le premier champ est entre le début de ligne et l'espace. D'où le décalage de champ quand on supprime l'espace
    • Pas la peine de faire une boucle sur les lignes. awk travaille ligne par ligne. Tu prends une liste (ton log) et il te rends une liste (tes ips & date). Pour faire un genre de csv réutilisable facilement avec awk, je conseille de mettre un séparateur (comme le point-virgule) entre les champs.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      awk 'lescript' fichierentree.txt >fichiersortie.txt
      ou
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      awk 'lescript' fichierentree.txt |tee fichiersortie.txt
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Etudiant en reseaux
    Inscrit en
    Janvier 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Etudiant en reseaux

    Informations forums :
    Inscription : Janvier 2013
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    Merci pour ces précisions

  11. #11
    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 baffreux Voir le message
    du coup j'ai plutôt suivis la méthode de flodelarab


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cat fichier.txt | while read ligne
    do
    echo $ligne | awk -F'[ =]' '{print $12,$14,$1,$2,$3;}' >> /home/jeremy/fichierlog
    done
    Cela fonctionne parfaitement, merci,
    Je suis surpris que personne n'ait réagi (sinon en moinssant!).

    Il est très coûteux de lire le fichier ligne à ligne et d'appeler un nouveau processus awk sur chaque ligne!

    Awk sait très bien lire le fichier ligne à ligne... comme l'a proposé Flodelarab!

    Pourquoi ne pas garder sa proposition telle quelle? ça ne marche pas chez toi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[ =]' '{print $12,$14,$1,$2,$3;}' fichier.txt > /home/jeremy/fichierlog

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    [MAUVAISE_FOIS] Dans son code, on voit des lignes vides dans sa boucle, on suppose donc qu'il fait d'autres choses qu'il ne veut pas nous dire[/MAUVAISE_FOIS]
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    [ironie]Oui, il voulait utiliser des variables bash pour calculer la moyenne des TTL[/ironie]

    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

Discussions similaires

  1. Résultat d'un GREP dans une variable
    Par IAzgardI dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 13/03/2014, 20h31
  2. Réponses: 2
    Dernier message: 27/03/2007, 01h19
  3. [MySQL] Résultat d'une requête dans un tableau
    Par olivier94 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 22/03/2007, 21h03
  4. [MySQL] Afficher le résultat d'une requête dans un tableau
    Par magobouli dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 26/02/2007, 14h41
  5. Réponses: 12
    Dernier message: 09/01/2007, 19h04

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