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 :

[awk] Afficher et modifier le nom des fichiers en cours de traitement ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Futur administrateur systèmes
    Inscrit en
    Décembre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Futur administrateur systèmes

    Informations forums :
    Inscription : Décembre 2010
    Messages : 57
    Par défaut [awk] Afficher et modifier le nom des fichiers en cours de traitement ?
    Bonjour,

    En tant que petit jeune dans le monde du script bash/awk, linux, [ insérer ce que vous voulez ], vous m'avez déjà bien aidé sur certains sujets, de ce fait, je sollicite une nouvelle fois votre aide !


    Toujours entrain de m'occuper de ma CGI en bash/html, j'ai réussi à répondre à toutes les demandes et à résoudre la majorité des problèmes rencontrés. Cependant, il en reste un " truc " avec lequel je me débat et impossible de trouver une solution.


    Ma CGI me permet de sélectionner via un menu déroulant le nom d'un FRAME. Une fois sélectionné, je peux voir sa consommation en RAM/CPU. Je travaille avec 276 csv, mon script passe donc dans tous ces fichiers, ne garde que les lignes contenant le nom du FRAME, ne garde que les colonnes nécessaires et affiche les informations comme cela :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    FRAME : MIAIBYA00 
    ------------------
     
    LPARS : miavioya01-not-work
    RAM : 
    CPU 1 : 
    CPU 2 : 
     
    LPARS : miaibc05
    RAM : 40
    CPU 1 : null
    CPU 2 : 2
     
    LPARS : miaiba05
    RAM : 18
    CPU 1 : null
    CPU 2 : 2
     
    LPARS : miaibf03
    RAM : 30
    CPU 1 : null
    CPU 2 : 3
     
    LPARS : miaiba14
    RAM : 19
    CPU 1 : null
    CPU 2 : 2
     
    LPARS : miaibe04
    RAM : 14
    CPU 1 : null
    CPU 2 : 6
     
    LPARS : miaiba12
    RAM : 17
    CPU 1 : null
    CPU 2 : 2
     
    LPARS : miaibc07
    RAM : 25
    CPU 1 : null
    CPU 2 : 2
     
    LPARS : miaibd05
    RAM : 19
    CPU 1 : null
    CPU 2 : 1
    Voici le code de ma page CGI sur laquelle s'affiche le résultat et contenant le script awk :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #!/bin/bash
     
     
    echo "Content-type: text/html"
    echo ""
     
    echo '
    <html>
            <head>
                    <meta http-equiv="Content-Type" content="test/html"; charset=UTF-8">
                    <title> CLF MONITORING </title>
                    <h1> FRAME monitoring <font size=3> <a href="Index.sh">[ Index ]</a> </font> </h1>
                    <hr size="4" color="blue">
     
            <style>
                             body{
                              background-color: #eff1f0;
                             }
            </style>
     
            </head>
    <body>'
     
    read a
    test=$( echo $a | cut -d'=' -f2)
    echo $test
     
    echo '<PRE>'
     
     
    echo "FRAME : $test "
    echo "------------------"
     
    echo ""
     
    cat /var/www/cgi-bin/LPAR_MAP/*.csv | grep $test | awk -F',|;' '{print $1","$2","$5","$6","$7}' | awk -F',|;' '{
     
    print "LPARS : " $2
    print "RAM : " $3
    print "CPU 1 : " $4
    print "CPU 2 : " $5
    print ""
    }'
    echo '</PRE>'
     
    echo '</body>
    </html>'
    Avec " read a ", " test=$( echo $a | cut -d'=' -f2) " et " echo $test ", je lis ma query string, le cut pour ne garder que ce dont j'ai besoin puis j'affiche le nom du FRAME.


    Comme je l'ai dit plus haut, j'ai 276 fichiers CSV à analyser qui sont de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MO1PPC03,mplaix0144,Running,AIX 7.1 7100-05-02-1810,60,0.5,3,DefaultPool,shared,uncap,128
    MO1PPC03,mplaix0158,Running,AIX 7.1 7100-05-02-1810,21,0.4,4,DefaultPool,shared,uncap,64
    MO1PPC03,mplaix0156,Running,AIX 7.1 7100-05-02-1810,45,0.6,6,DefaultPool,shared,uncap,64
    MO1PPC03,mplaix0154,Running,Unknown,50,0.4,8,DefaultPool,shared,uncap,64
    MO1PPC03,mplaix0150,Running,AIX 7.1 7100-05-02-1810,119,1.2,21,DefaultPool,shared,uncap,64
    MO1PPC03,mplaix0117,Running,AIX 7.1 7100-05-02-1810,90,3,12,DefaultPool,shared,uncap,128
    MO1PPC03,mplaix0142,Running,AIX 7.1 7100-05-02-1810,90,0.5,5,DefaultPool,shared,uncap,128
    MO1PPC03,mplaix0141,Running,AIX 7.1 7100-05-02-1810,60,1,2,DefaultPool,shared,uncap,128
    MO1PPC03,mplaix0033,Running,AIX 6.1 6100-09-10-1731,105,15,17,MPLSPPIWS01P,shared,uncap,128
    MO1PPC03,mplaix0111,Running,AIX 7.1 7100-05-02-1810,79,1,5,MPLSPPA2P1P,shared,uncap,128



    Avec ce que j'ai pour le moment, j'arrive à afficher tous les frames mais je n'arrive pas à savoir à quel fichier ils appartiennent. L'idée serait de faire quelques choses du style :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
     
    FRAME : MIAIBYA00 
    ------------------
     
    File : File1.csv
     
    LPARS : miavioya01-not-work
    RAM : 
    CPU 1 : 
    CPU 2 : 
     
    LPARS : miaibc05
    RAM : 40
    CPU 1 : null
    CPU 2 : 2
     
    LPARS : miaiba05
    RAM : 18
    CPU 1 : null
    CPU 2 : 2
     
    File : File2.csv
     
    LPARS : miaibf03
    RAM : 30
    CPU 1 : null
    CPU 2 : 3
     
    LPARS : miaiba14
    RAM : 19
    CPU 1 : null
    CPU 2 : 2
     
    LPARS : miaibe04
    RAM : 14
    CPU 1 : null
    CPU 2 : 6
     
    LPARS : miaiba12
    RAM : 17
    CPU 1 : null
    CPU 2 : 2
     
     
    File : File3.csv
     
    LPARS : miaibc07
    RAM : 25
    CPU 1 : null
    CPU 2 : 2
     
    LPARS : miaibd05
    RAM : 19
    CPU 1 : null
    CPU 2 : 1
    Bref, pouvoir ajouter une ligne indiquant le nom du fichier auquel appartiennent les informations.


    J'ai cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find . -maxdepth 1 -name '*.csv' -printf 'File : %f\n' -exec ./test4.sh {} \;
    Et...Génial, avec un fichier aaaa.csv et bbbb.csv, ça fonctionne d'enfer :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    File : aaaa.csv
    LPARS : sg2as088
    RAM : 10
    CPU 1 : 0.4
    CPU 2 : 2
     
    LPARS : sg2as059
    RAM : 12
    CPU 1 : 0.5
    CPU 2 : 2
     
    LPARS : sg2as139
    RAM : 10
    CPU 1 : 0.5
    CPU 2 : 3
     
    LPARS : miaibya08
    RAM : 62
    CPU 1 : 2
    CPU 2 : 4
     
    File : bbbb.csv
    LPARS : sg2as088
    RAM : 10
    CPU 1 : 0.4
    CPU 2 : 2
     
    LPARS : sg2as059
    RAM : 12
    CPU 1 : 0.5
    CPU 2 : 2
     
    LPARS : sg2as139
    RAM : 10
    CPU 1 : 0.5
    CPU 2 : 3
     
    LPARS : miaibya08
    RAM : 62
    CPU 1 : 2
    CPU 2 : 4
     
    LPARS : FRCFQAM00MIC2XM
    RAM : 6
    CPU 1 : 0.4
    CPU 2 : 3

    Donc super, juste avec cette commande, j'arrive à faire ce dont j'ai besoin. Le problème c'est que c'est une commande que je tape dans mon terminal. Ce qu'il faudrait, c'est l'intégrer à ma CGI. Je reprends donc le code de ma page ( celui que j'ai donné un peu plus haut ), et je réfléchis... L'avantage avec mon premier code, c'est que je peux faire un grep et ne garder que les lignes qui m’intéressent. L'avantage avec cette ligne de commande, c'est que j'arrive à afficher les informations en-dessous du fichier auxquelles elles appartiennent.

    Et là, je bloque. Comment faire les deux en même temps ?

    Ma ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find . -maxdepth 1 -name '*.csv' -printf 'File : %f\n' -exec ./test4.sh {} \;
    Affiche les noms des fichiers de l'intégralité des CSV puis exécute mon script. Je suppose donc que c'est au niveau de mon script que je dois modifier quelque chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    cat /var/www/cgi-bin/LPAR_MAP/*.csv | grep $a | awk -F',|;' '{print $1","$2","$5","$6","$7}' | awk -F',|;' '{
     
    print "LPARS : " $2
    print "RAM : " $3 
    print "CPU 1 : " $4 
    print "CPU 2 : " $5 
    print ""
    }'

    Mais mon script fouille déjà ma liste de fichier csv... N'y aurait-il pas un moyen pour faire tout ça en même temps ?

    Donc ça, c'était le problème pour afficher les noms de fichiers.


    --------------


    Maintenant, deuxième partie du problème :

    Les noms de fichiers sont de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sys-map-20180913.csv

    Là dedans, la seule chose qui m'intéresse, c'est la partie date que j'arrive à extraire en tapant dans un terminal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    echo sys-map-20180913.csv | cut -d'-' -f3 | cut -d'.' -f1
     
    ou
     
    echo sys-map-20180913.csv | grep -oP "\d{8}"
    Ce qui donne :


    Cette fois-ci, sans même chercher à intégrer cette demande à mon script, sauriez-vous comment ajouter le " cut -d'-' 'f3 | cut -d'.' -f1 " ou le " grep -oP " \d{8}" " à cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name '*.csv' -printf 'File : %f\n' -exec ./test4.sh {} \;


    Voilà... Je bloque là dessus. Désolé pour le post un peu long ! Je suppose que je fais beaucoup de mauvaise chose, notamment au niveau des cut qui se suivent et des deux awk, mais je ne vois pas comment faire autrement pour le moment. N'hésitez pas à me corriger donc !

    Pourriez-vous m'éclairer de vos lanternes ? Merci d'avance !


    Merci d'avance !

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    • c'est toujours une mauvaise idée de nommer ses variables ou ses fonctions "test", on va plutôt opter pour "frame" tout simplement
    • awk dispose de la variable FILENAME, bien pratique ici, et on peut également lui passer plusieurs fichier en paramètre pour qu'il les traite séquentiellement (*.csv)
    • on évite les tournures type echo "hello world" | awk '{print $1 " " $2}' | awk '{print $1 " " $2}' | awk '{print $1 " " $2}' | awk '{print $1 ", " $2 " !"}', ça n'a aucun intérêt et ça spawn un nouveau process à chaque fois


    pour le moins un code comme celui-ci (non-testé) peut probablement améliorer l'ensemble :
    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
    read a
    frame=$( echo $a | cut -d'=' -f2)
    awk -vFRAME="$frame" -F',|;' '
       BEGIN {
          printf("<pre>\n")
       }
     
       $0 ~ FRAME {
          if (fichier != FILENAME) {
             fichier = FILENAME
             printf ("File : %s\n\n", fichier)
          }
          printf("LPARS : %s\nRAM   : %d\nCPU 1 : %d\nCPU 2 : %d\n\n", $2, $5, $6, $7)
       }
     
       END {
          printf("</pre>\n</body>\n</html>\n")
       }
    ' /var/www/cgi-bin/LPAR_MAP/*.csv
    on sent bien qu'une des idées conductrices est celle d'utiliser le moins de commandes possibles, tout faire rentrer dans le awk est certainement faisable, sachant qu'en général on remplacera plus facilement bash/awk par Perl, Python, PHP ou même Ruby

Discussions similaires

  1. [Batch] Afficher le nom des fichiers disposant d'un/plusieurs espace(s)
    Par Olivier Regnier dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 08/09/2012, 17h22
  2. [XL-2003] Afficher dans une cellule le nom des fichiers liaison
    Par Philippe76 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/05/2011, 08h07
  3. Réponses: 18
    Dernier message: 08/10/2009, 15h22
  4. Réponses: 3
    Dernier message: 19/06/2007, 14h07
  5. Modifier le nom des champs d'une table...
    Par Mr Capone dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/01/2005, 10h22

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