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

Linux Discussion :

Parser logs apache pour extraire dans un CSV


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut Parser logs apache pour extraire dans un CSV
    Bonjour,

    Je suis issu du dev web et je débute en shell. J'aimerai créer un script KSH qui sera éxécuter avec un cron et qui fera le travail suivant:

    Parser un fichier de log apache:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ::1 - - [21/Apr/2009:09:38:52 +0200] "GET /.gif&utilisation=1&acces=1@stats=2 HTTP/1.1" 200 - "-" "Bla CFNetwork/422.11 Darwin/9.6.3 (i386) (iMac9%2C1)"
    ::1 - - [21/Apr/2009:09:38:53 +0200] "GET /.gif&utilisation=1&acces=1@stats=3 HTTP/1.1" 200 - "-" "Bla CFNetwork/422.11 Darwin/9.6.3 (i386) (iMac9%2C1)"
    ::1 - - [21/Apr/2009:09:38:57 +0200] "GET /.gif&utilisation=1&acces=2@carotte=2 HTTP/1.1" 200 - "-" "Bla CFNetwork/422.11 Darwin/9.6.3 (i386) (iMac9%2C1)"
    ::1 - - [21/Apr/2009:09:38:59 +0200] "GET /.gif&utilisation=1&acces=1@patate=8 HTTP/1.1" 200 - "-" "Bla CFNetwork/422.11 Darwin/9.6.3 (i386) (iMac9%2C1)"
    Afin de créer un nouveau fichier CSV qui affichera mes logs de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # ----------------------------------------
    # Table
    # ----------------------------------------
    /.gif&utilisation=1&acces=1@stats=2
    /.gif&utilisation=1&acces=1@stats=3
    /.gif&utilisation=1&acces=2@carotte=2
    /.gif&utilisation=1&acces=1@patate=8
    # --------------------------------------------------------------------------------
    Pouvez-vous m'aider? je suis perdu dans l'écriture d'un tel script


    merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    un petit coup de sed :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/.*GET \(.*\) HTTP.*/\1/g'  apache.log
    donne :

    /.gif&utilisation=1&acces=1@stats=2
    /.gif&utilisation=1&acces=1@stats=3
    /.gif&utilisation=1&acces=2@carotte=2
    /.gif&utilisation=1&acces=1@patate=8


    pour le reste un simple echo " ...... " suffit

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    En effet très efficace, cependant cela écrit dans mon terminal, comment extraire tout ca dans un CSV?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    pas très courageux quand meme


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/ksh
     
    echo "# ----------------------------------------" > ./CSV
    echo "# Table" >> ./CSV
    echo "# ----------------------------------------" >> ./CSV
    sed -e 's/.*GET \(.*\) HTTP.*/\1/g' ./apache.log >> ./CSV
    echo >> ./CSV
    echo "# --------------------------------------------------------------------------------" >> ./CSV
    => parse.sh
    => cat ./CSV
    # ----------------------------------------
    # Table
    # ----------------------------------------
    /.gif&utilisation=1&acces=1@stats=2
    /.gif&utilisation=1&acces=1@stats=3
    /.gif&utilisation=1&acces=2@carotte=2
    /.gif&utilisation=1&acces=1@patate=8
    # --------------------------------------------------------------------------------

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    en effet avec tout ca je comprend mieux comme marche ce langage... merci


    cependant est-ce possible de regrouper dans la regex les lignes identifiques. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /.gif&utilisation=1&acces=1@stats=2
    /.gif&utilisation=1&acces=1@stats=3
    /.gif&utilisation=1&acces=2@carotte=1
    /.gif&utilisation=1&acces=1@carotte=1
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /.gif&utilisation=1&acces=1@stats=2, 1
    /.gif&utilisation=1&acces=1@stats=3, 1
    /.gif&utilisation=1&acces=2@carotte=1, 2

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    dans ton exemple, ils ont pas le meme accès les deux derniers

    mais pour répondre a ta question, oui c'est possible
    très simplement j'en suis pas sur

    en gros faut sauvegarder ta ligne, la comparer aux suivantes
    si il y a matching tu incrémentes un compteur
    sinon tu passes
    quand tu as fini tu affiches ta ligne si ton compteur est a zero
    sinon tu affiche ta ligne suivi de la valeur du compteur+1

    puis tu passes a la deuxième ligne ...
    (pas très optimisé sans parler qu'il faut supprimer les lignes qui ont été matchées)


    le perl serait beaucoup mieux adapté pour ça

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    En Perl? je ne connais pas non plus ce langage.. N'y a t'il pas un moyen simple de réaliser ceci en ksh?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    disons que c est tellement simple en perl, donc pourquoi s'embeter a le faire en ksh

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    OK. Comment dois-je m'y prendre en PERL?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    c est très mal écrit mais j'avais un peu la flemme

    parse.ksh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/ksh
     
    echo "# ----------------------------------------" > ./CSV
    echo "# Table" >> ./CSV
    echo "# ----------------------------------------" >> ./CSV
    sed -e 's/.*GET \(.*\) HTTP.*/\1/g' ./parse >> ./temp
    ./parse.pl
    rm ./temp
    echo >> ./CSV
    echo "# --------------------------------------------------------------------------------" >> ./CSV
    parse.pl
    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
    28
    29
    30
    31
    32
    33
    34
    #!/usr/local/bin/perl
     
    my $INPUT_FILE = "/temp/apache.log";
    my $OUTPUT_FILE = "/temp/CSV";
    my $i = 0;
     
     
    open (HANDLE_INPUT_FILE, $INPUT_FILE) || die "open problem of $INPUT_FILE : $!";
    my @contenu = <HANDLE_INPUT_FILE>;
    close(HANDLE_INPUT_FILE);
     
    open (HANDLE_INPUT_FILE2, $INPUT_FILE) || die "open problem of $INPUT_FILE : $!";
    my @contenu2 = <HANDLE_INPUT_FILE2>;
    close(HANDLE_INPUT_FILE2);
     
    open (HANDLE_OUTPUT_FILE, ">$OUTPUT_FILE") || die "open problem of $OUTPUT_FILE : $!";
    foreach my $line (@contenu) {
    $i++;
    }
    for ($j = 0; $j <= $i-1 ; $j++) {
    	my $compteur = 0;
    	for ($k = 0; $k <= $i-1 ; $k++) {
    		if( @contenu[$j] eq @contenu2[$k]){
    			$compteur++;
    			delete(@contenu2[$k]);
    		}
    	}
    	if ( $compteur eq 0) {}
    	else {
    		chomp @contenu[$j];
    		print HANDLE_OUTPUT_FILE "@contenu[$j], $compteur \n";
    	}
    }
    close(HANDLE_OUTPUT_FILE);

    mais au moins ça marche

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    merci beaucoup pour ton aide

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Bonsoir,
    Je peux me tromper mais sort et uniq ne serait pas approprié pour ce que tu veux faire ?
    uniq sert justement a supprimer les occurences similaires, je le combine avec sort afin de regrouper les memes occurences.

    exemple:
    dans mon fichier /tmp/warnings.txt j'ai des connections indésirées
    sous forme
    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
     
    00:54:51.427 Connection from IP: 84.227.174.64 Login Failed!
    00:54:54.106 Connection from IP: 90.5.166.45 Login Failed!
    00:55:02.132 Connection from IP: 84.227.174.64 Login Failed!
    00:55:04.710 Connection from IP: 90.5.166.45 Login Failed!
    00:55:13.946 Connection from IP: 84.227.174.64 Login Failed!
    00:55:17.728 Connection from IP: 90.5.166.45 Login Failed!
    00:55:29.223 Connection from IP: 84.227.174.64 Login Failed!
    00:55:30.516 Connection from IP: 90.5.166.45 Login Failed!
    00:55:41.339 Connection from IP: 84.227.174.64 Login Failed!
    00:55:42.602 Connection from IP: 90.5.166.45 Login Failed!
    00:55:52.176 Connection from IP: 84.227.174.64 Login Failed!
    00:55:57.136 Connection from IP: 90.5.166.45 Login Failed!
    00:56:04.633 Connection from IP: 84.227.174.64 Login Failed!
    00:56:09.169 Connection from IP: 90.5.166.45 Login Failed!
    00:56:18.762 Connection from IP: 84.227.174.64 Login Failed!
    00:56:20.916 Connection from IP: 90.5.166.45 Login Failed!
    00:56:31.033 Connection from IP: 84.227.174.64 Login Failed!
    pour recuperer les adresse ip a bannir automatiquement avec iptables, il faut que je le lise decoupe et organise(plusieurs meme ip en tentative comme tu peux le voir)
    un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat /tmp/warnings.txt | cut -d ' ' -f5 | sort -n | uniq
    me permet de filtrer pour n'avoir qu'une seul occurence des ip a injecter dans iptables.
    voila la sortie ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    90.5.166.45
    84.227.174.64
    85.10.103.185
    c'était juste une piste

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Citation Envoyé par pitbac23 Voir le message
    Bonsoir,
    Je peux me tromper mais sort et uniq ne serait pas approprié pour ce que tu veux faire ?
    uniq sert justement a supprimer les occurences similaires, je le combine avec sort afin de regrouper les memes occurences.
    t aurais pu le dire plus tot

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    t aurais pu le dire plus tot
    Parfois je prefère me taire que de dire des aneries.

Discussions similaires

  1. Boucle xml pour extraire dans un csv sur Talend
    Par Petude dans le forum Développement de jobs
    Réponses: 7
    Dernier message: 19/06/2015, 15h49
  2. [Wamp] Voir log apache et php dans une console ?
    Par yamatoshi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 07/12/2011, 19h40
  3. [SQL-Server] Parser un tableau pour exploitation dans une requête avec IN
    Par arthuro45 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/05/2011, 12h54
  4. Parser de fichier textes >> Logs Apache
    Par gregb34 dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2006, 19h34
  5. Utiliser un parser pour extraire des formules
    Par EpOnYmE187 dans le forum C++
    Réponses: 2
    Dernier message: 16/03/2005, 00h55

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