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 et les expressions régulières


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 7
    Points
    7
    Par défaut awk et les expressions régulières
    Bonjour à tous,

    Le but de ma démarche est d'essayer d'extraire de la commande TOP les processus actifs (dont le %CPU N'EST PAS 0,0) et de les ressortir sous la forme toute simple NOM %CPU

    (la raison est simplement de m'exercer aux expressions regulieres, à awk sed grep et companie et aussi de me créer des petits fichiers log avec les ressources CPU mémoire et processus)

    voici un extrait de top pour voir sur quoi on travaille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Tasks: 122 total,   1 running, 121 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0,3 us,  0,3 sy,  0,0 ni, 99,4 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    KiB Mem:  16415356 total,  2191020 used, 14224336 free,   152324 buffers
    KiB Swap: 15624188 total,        0 used, 15624188 free,   401636 cached
     
      PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
     4535 cpas      20   0 1568m 1,2g 1,2g S   3,7  7,6  99:32.51 VBoxHeadless
        1 root      20   0 10648  836  704 S   0,0  0,0   0:01.74 init
        2 root      20   0     0    0    0 S   0,0  0,0   0:00.00 kthreadd
        3 root      20   0     0    0    0 S   0,0  0,0   0:02.49 ksoftirqd/0
    j'ai donc essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    top -n 1 | awk '$10!~/(0,0)/ {print $13, $10;}'
     
     
    résultat:
    init 0,0
    kthreadd 0,0
    ksoftirqd/0 0,0
    migration/0 0,0
    watchdog/0 0,0
    migration/1 0,0
    ksoftirqd/1 0,0
    watchdog/1 0,0
    qui teste si la colonne 10 (%CPU) EST '0,0' et si c'est le cas affiche en sortie les colonnes 13 et 10 (nom et %CPU)

    Ceci fonctionne assez bien mais je ne parviens pas a sortir l'inverse, càd de me sortir ce qui N'EST PAS '0,0'

    là je bloque, je commence à m'interesser aux lookaround mais j'ai du mal...

    je parviens à le faire avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    top -n 1 | awk '$10~/(0,0)/ {print $13, $10;}'
    mais j'aimerais nier l'expression régulière et pas l'opérateur de la commande awk

    Quelqu'un pourrait m'aider avec ceci ?



    J'ai également un autre soucis:

    Au fil de mes tests je suis arrivé à taper la commande suivante calquée sur la précédente mais qui ne fonctionne pas systématiquement...
    Là je me gratte la tête mais je ne comprends 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
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    cpas VBoxHeadless 6,4
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    cpas VBoxHeadless 6,4
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    cpas VBoxHeadless 6,4
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    cpas VBoxHeadless 6,4
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    cpas VBoxHeadless 6,4
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    cpas VBoxHeadless 6,4
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    root@svr66:~# top -n 1 | awk '$3~/(cpa)/ {print $3, $13, $10;}'
    cpas VBoxHeadless 6,4
    root@svr66:~#
    Comme vous pourrez le constater la commande filtre bien les processus appartenant au user cpas.
    En fait un seul processus, qui est une machine virtuelle sous virtualbox, en fonction
    Le problème c'est que parfois, vous l'aurez constaté, la commande ne retourne rien alors que le processus est toujours bien actif.
    Je ne spamme pas la commande et le fait du résultat ou d'absence de résultat me parait aléatoire...

    Quelqu'un aurait une explication à cette question bonus ?


    merci d'avance

    olivier

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Utilises l'option -b (mode batch) de top pour mieux capturer la sortie et pouvoir la filtrer :

    top -b -n1 | awk '$1 ~ /^[[:digit:]]/ && $9 !~ /0,0/ { print $12,$9}'

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 906
    Points : 6 696
    Points
    6 696
    Par défaut
    Les expressions régulières de awk ne supportent pas les lookahead, de toute manière utiliser l'opérateur !~ est une meilleur option que de devoir construire une "pattern négative", ce qui n'est jamais bien pratique. Exemple en jouant sur les classes de caractères: ^([^0]|0([^,]|$)|0,([^0]|$)) (je te laisse imaginer avec une chaîne à exclure plus longue).

    Autre chose, écrire $10!~/0,0/, revient à dire: "le champ 10 ne comporte pas la chaîne 0,0". Or c'est le cas pour par exemple la valeur 10,0 qui du coup sera exclue.

    Pour parer à cette éventualité, il faut ajouter une ancre de début de chaîne ^: $10!~/^0,0/

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

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

    Que c'est compliqué tout ça.
    Une condition, ça peut s'opposer.

    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
    $ top -b -n1| awk '($10 ~ /0,0/){print $10,$12;}'                                                                                                                                                        
    0,0 kworker/7:0
    0,0 top
    0,0 init
    0,0 kthreadd
    0,0 ksoftirqd/0
    0,0 kworker/0:0H
    (...)
    0,0 tmux
    0,0 bash
    0,0 unity-webapps-s
    0,0 cat
    0,0 sh
    0,0 run-parts
    0,0 apt
    0,0 sleep
    0,0 deja-dup-monito
    0,0 kworker/6:2
    0,0 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
    $ top -b -n1| awk '!($10 ~ /0,0/){print $10,$12;}'                                                                                                                                                       
    average: 0,08,
    0 
    1,0 0,0
    buffers 
    cached 
     
    %MEM COMMAND
    0,3 Xorg
    2,0 firefox
    0,3 plugin-containe
    (...)
    0,1 unity-fallback-
    0,2 nautilus
    0,1 polkit-gnome-au
    0,1 nm-applet
    0,1 telepathy-indic
    0,1 mission-control
    0,1 gnome-terminal
    0,1 zeitgeist-datah
    0,1 update-notifier
    $

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    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 311
    Points : 12 828
    Points
    12 828
    Par défaut
    Bonjour,
    Ici, je ne comprends pas le besoin d'une expression régulière, la valeur que tu cherches pour ne pas prendre en compte la ligne est fixe, donc une simple comparaison de chaines est suffisante et plus sure.

Discussions similaires

  1. [VB.net][vs2005] Problème avec les expressions régulières
    Par zouhib dans le forum Windows Forms
    Réponses: 13
    Dernier message: 22/06/2006, 15h56
  2. Problème avec les expressions régulières
    Par Premium dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 18/06/2006, 16h41
  3. Les Expressions Régulières
    Par zEndymion dans le forum Access
    Réponses: 4
    Dernier message: 12/06/2006, 13h36

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