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 :

Redirection sortie print AWK ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut Redirection sortie print AWK ?
    Bonjour;
    Je suis sous RHEL 6.1.
    J'aimerais savoir comment faire pour ne créer qu'un seul fichier de sortie qui me permettrait d'obtenir le top10 des uploaders (via leur login $1 et leur debit d'upload $14 des access_logs) pour tous les proxy-http.

    Voici mon code SH :
    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
     
    for log_a_traite in `find /root/scripts/PROXY -name "access_logs*.s" -type f -size +0k | sort | xargs ls -1`
    do
            #echo "log_a_traite="$log_a_traite
            basename_log_traite=`basename $log_a_traite`
    #      echo "basename_log_traite="$basename_log_traite
            nom_proxy=`echo $log_a_traite | cut -d/ -f5`
            awk  '{
            # On agrege par login les request size
            #       if ($1 != "#" ) pour eviter ligne de commentaires des logs
                            tab_top10_upload[$8]+=$14
                    }
            END {
            # On trie par upload et on affiche le resultat des sommes des request size
                    for (x in tab_top10_upload) {
                            print x" "tab_top10_upload[x] | "sort -n -r"
                    }
           }' $log_a_traite > /root/scripts/tmp/top10upload_${nom_proxy}_${basename_log_traite}.txt
    done
    Avec ce code, j'obtiens un top10 pour chaque fichier de logs pour chaque proxy. J'aimerais un seul fichier top10 pour tous les proxys.

    En fait il faudrait que j'arrive à initialiser un tableau "total" (avec la somme des debits d'upload par user) à l'exterieur de AWK mais tout de meme dans la boucle sur les fichiers de log... OU alors fusionner tous les fichiers à plats /tmp/top10upload_${nom_proxy}_${basename_log_traite}.txt (en faisant la somme de la deuxieme colonne par rapport à la premiere [login]) ...

    Merci de votre aide

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    Bonjour,

    a priori, la boucle shell n'est pas utile (quelle est la hiérarchie des répertoires contenant les logs ?) : awk peut traiter plusieurs fichiers passés en paramètres.

    awk dispose de fonctions de tri, un peu contraignante, mais tellement plus efficace que d'appeler un programme externe.

    ce serait bien d'avoir quelques échantillons des logs, et du résultat que tu souhaites obtenir à partir de ces échantillons.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut
    OK. Merci de prendre le temps de réfléchir la dessus avec moi N_BaH.

    Alors voici la structure dans laquelle mon find va piocher les fichiers de log (.s) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /root/scripts/PROXY/proxy-http<num_proxy>/access_logs/access_logs.@<year><month><day>T<heure><minute><seconde>.s
    Et voici à quoi ressemble les 5 premieres lignes d'un fichier de log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1363700026.084 30 <@IP> TCP_MISS/200 286 GET http://ping.chartbeat.net/ping?h=lexpress.fr&p=%2Factualite%2Fsociete%2Fun-rer-attaque-par-une-vingtaine-de-jeunes-dans-l-essonne_1232775.html&u=ecrxf25fx728wuqv&d=lexpress.fr&g=33094&g0=Societe&n=1&f=1&c=1.75&x=3500&y=6119&w=909&j=30&R=1&W=0&I=0&E=75&b=1740&t=dci256zldq3sabxq&V=8&_ "loginAD" DIRECT/ping.chartbeat.net image/gif DEFAULT_CASE_11-Politique_des_utilisateurs_AD-DefaultGroup-NONE-NONE-NONE-DefaultGroup <IW_comp,-5.8,0,"-",0,0,0,1,"-",-,-,-,"-",1,-,"-","-",-,-,IW_comp,-,"-","adware","Ads and Tracking","Ad Networks","-","-",8.80,0,-,"-","-"> - 0
    1399700026.084 60 <@IP> TCP_MISS/200 2286 GET http://ping.chartbeat.net/ping?h=lexpress.fr&p=%2Factualite%2Fsociete%2Fun-rer-attaque-par-une-vingtaine-de-jeunes-dans-l-essonne_1232775.html&u=ecrxf25fx728wuqv&d=lexpress.fr&g=33094&g0=Societe&n=1&f=1&c=1.75&x=3500&y=6119&w=909&j=30&R=1&W=0&I=0&E=75&b=1740&t=dci256zldq3sabxq&V=8&_ "loginAD3" DIRECT/ping.chartbeat.net image/gif DEFAULT_CASE_11-Politique_des_utilisateurs_AD-DefaultGroup-NONE-NONE-NONE-DefaultGroup <IW_comp,-5.8,0,"-",0,0,0,1,"-",-,-,-,"-",1,-,"-","-",-,-,IW_comp,-,"-","adware","Ads and Tracking","Ad Networks","-","-",8.80,0,-,"-","-"> - 11111
    1399700026.084 60 <@IP> TCP_MISS/200 2286 GET http://ping.chartbeat.net/ping?h=lexpress.fr&p=%2Factualite%2Fsociete%2Fun-rer-attaque-par-une-vingtaine-de-jeunes-dans-l-essonne_1232775.html&u=ecrxf25fx728wuqv&d=lexpress.fr&g=33094&g0=Societe&n=1&f=1&c=1.75&x=3500&y=6119&w=909&j=30&R=1&W=0&I=0&E=75&b=1740&t=dci256zldq3sabxq&V=8&_ "loginAD" DIRECT/ping.chartbeat.net image/gif DEFAULT_CASE_11-Politique_des_utilisateurs_AD-DefaultGroup-NONE-NONE-NONE-DefaultGroup <IW_comp,-5.8,0,"-",0,0,0,1,"-",-,-,-,"-",1,-,"-","-",-,-,IW_comp,-,"-","adware","Ads and Tracking","Ad Networks","-","-",8.80,0,-,"-","-"> - 17
    1300700026.084 60 <@IP> TCP_MISS/200 2286 GET http://ping.chartbeat.net/ping?h=lexpress.fr&p=%2Factualite%2Fsociete%2Fun-rer-attaque-par-une-vingtaine-de-jeunes-dans-l-essonne_1232775.html&u=ecrxf25fx728wuqv&d=lexpress.fr&g=33094&g0=Societe&n=1&f=1&c=1.75&x=3500&y=6119&w=909&j=30&R=1&W=0&I=0&E=75&b=1740&t=dci256zldq3sabxq&V=8&_ "loginAD2" DIRECT/ping.chartbeat.net image/gif DEFAULT_CASE_11-Politique_des_utilisateurs_AD-DefaultGroup-NONE-NONE-NONE-DefaultGroup <IW_comp,-5.8,0,"-",0,0,0,1,"-",-,-,-,"-",1,-,"-","-",-,-,IW_comp,-,"-","adware","Ads and Tracking","Ad Networks","-","-",8.80,0,-,"-","-"> - 5
    1311700026.084 60 <@IP> TCP_MISS/200 2286 GET http://ping.chartbeat.net/ping?h=lexpress.fr&p=%2Factualite%2Fsociete%2Fun-rer-attaque-par-une-vingtaine-de-jeunes-dans-l-essonne_1232775.html&u=ecrxf25fx728wuqv&d=lexpress.fr&g=33094&g0=Societe&n=1&f=1&c=1.75&x=3500&y=6119&w=909&j=30&R=1&W=0&I=0&E=75&b=1740&t=dci256zldq3sabxq&V=8&_ "loginAD2" DIRECT/ping.chartbeat.net image/gif DEFAULT_CASE_11-Politique_des_utilisateurs_AD-DefaultGroup-NONE-NONE-NONE-DefaultGroup <IW_comp,-5.8,0,"-",0,0,0,1,"-",-,-,-,"-",1,-,"-","-",-,-,IW_comp,-,"-","adware","Ads and Tracking","Ad Networks","-","-",8.80,0,-,"-","-"> - 1745
    A partir de ces lignes je dois récupérer les logins (champs 8) et le debit d upload en fin de ligne (dernier champs).

    Le top10 après traitement d'un fichier de log (que je stocke dans un rep temporaire) :
    vm-rh61 scripts $ ls -ltr ./tmp/*
    -rw------- 1 root root 46 Mar 21 14:54 ./tmp/top10upload_proxy-http1_access_logs.@20130319T000000.s.txt
    -rw------- 1 root root 46 Mar 21 14:54 ./tmp/top10upload_proxy-http2_access_logs.@20130319T111111.s.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "loginAD3" 11111
    "loginAD2" 1750
    "loginAD" 17
    Le top10ALL que j'obtiens pour le moment (vu que le tableau est ré écraser à chaque lecture de log :/) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "loginAD3" 11111
    "loginAD2" 1750
    "loginAD" 17
    Le top10ALL que j'aimerais obtenir (un tableau non ré ecrasé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "loginAD3" 22222
    "loginAD2" 3500
    "loginAD" 34
    Donc vu que SH ne gère pas les tableau multidimensionné je suis passé par AWK mais bon.

    Et si je concaténais tous les logs un par un apres le traitement AWK j'obtiendrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    "loginAD3" 11111
    "loginAD2" 1750
    "loginAD" 17
    "loginAD3" 11111
    "loginAD2" 1750
    "loginAD" 17
    Y aurait moyen de fusionner ces lignes ?

    Merci pour votre aide

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut
    Bon bah je crée une liste des fichiers a etudier et je rebalance cette liste en entrée de AWK...

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Tu peux t'inspirer de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    idriss@ThinkPad-T420 ~ $ cat test.txt 
    "loginAD3" 11111
    "loginAD2" 1750
    "loginAD" 17
    "loginAD3" 11111
    "loginAD2" 1750
    "loginAD" 17
    idriss@ThinkPad-T420 ~ $ awk -F ' ' '{if ($1 in array) {array[$1]=array[$1]+$2} else {array[$1]=$2}} END {for (i in array){print i" "array[i]}}' test.txt 
    "loginAD" 34
    "loginAD2" 3500
    "loginAD3" 22222
    idriss@ThinkPad-T420 ~ $
    Cordialement,
    Idriss

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut
    Merci ok.Idriss;
    Je prefere passer par la creation d'une variable "liste de fichier" ça me permet de la recreer a volonte et de généraliser mon code.

    Mais je garde ta soluce AWK en memoire merci !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    j'ai cherché des solutions compliquées à base de asort, mais finalement, ça se fait simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{PROCINFO["sorted_in"]="@val_num_desc"}$NF>0{a[$8]+=$NF}END{for(i in a)print i,a[i]}' /root/scripts/PROXY/proxy-http<num_proxy>/access_logs/access_logs.@*T*.s
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Redirection sortie Telnet
    Par homeostasie dans le forum Windows
    Réponses: 0
    Dernier message: 19/09/2007, 10h27
  2. redirection sortie script
    Par crazykangourou dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 02/04/2007, 15h01
  3. system et redirection sortie standard sous linux
    Par Choupinou dans le forum Linux
    Réponses: 14
    Dernier message: 11/01/2007, 23h25
  4. Redirection sortie standard - Problème encoding
    Par schniouf dans le forum Langage
    Réponses: 4
    Dernier message: 12/12/2006, 13h51
  5. [ASE 12.5.1] Redirection de PRINT dans un fichier de log
    Par zayro dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 21/04/2006, 12h48

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