Filtrage de la sortie de la commande supérieure

12

J'utilise un Mac et je souhaite filtrer la sortie de la topcommande pour un processus particulier de sorte que seules les colonnes PID, COMMAND et% CPU soient affichées.

Après avoir obtenu le PID du processus, je lance:

top -pid 1234

Cependant, cela affiche plus de 15 colonnes pour ce processus. Puis-je diriger la sortie de la commande vers awk et n'afficher que:

PID COMMAND %CPU

Colonnes?

Je ne veux pas stocker la sortie dans un fichier texte, puis la traiter. Je souhaite suivre le processus en temps réel.

fumeurs
la source

Réponses:

8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: votre identifiant de processus
  • -stats pid,command,cpu: affiche uniquement l'ID du processus, le nom et le CPU%

Pas besoin de s'exécuter awksur la sortie.


Si vous souhaitez post-traiter la sortie, utilisez -l 0pour exécuter en mode de journalisation (0 signifie indéfiniment, tout le reste limite le nombre d'échantillons). La sortie ressemblera à ceci (deux répétitions):

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

Utilisez awkou un outil similaire pour afficher uniquement toutes les 13 lignes (car ces lignes contiennent les valeurs dans cet exemple):

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 
Daniel Beck
la source
# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg
@AstraSerg fonctionne pour moi. Notez qu'il s'agit d'une question Mac OS, qui a un autre topque Linux.
Daniel Beck
6

Cela peut certainement être fait et je vais expliquer comment je procéderais. Je ne prétends pas que c'est une approche optimale, mais elle fait l'affaire. J'utilise Linux (et bash shell), donc le comportement par défaut de mon top peut être légèrement différent. Ainsi, vous devrez peut-être régler ce mini-howto pour votre scénario particulier.

  1. Courez juste en haut , sans aucun argument:

    $ top

    Voici l'en-tête et une ligne pertinente de ma sortie:

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    J'ai choisi un processus qui reste en mémoire pendant un certain temps et consomme réellement du CPU, je vais l'utiliser comme processus de test pour atteindre l'objectif final.

  2. Par défaut, top s'exécute en mode interactif. Cela ne me convient pas, je souhaite capturer les données pertinentes et les imprimer. Je gérerai ensuite la tâche d'afficher les données de manière interactive. Citations pertinentes de la page de manuel supérieure:

    -b: fonctionnement en mode batch Démarre top en «mode batch», ce qui peut être utile pour envoyer la sortie de top vers d'autres programmes ou vers un fichier. Dans ce mode, top n'acceptera pas d'entrée et s'exécute jusqu'à ce que la limite d'itérations que vous avez définie avec l'option de ligne de commande «-n» ou jusqu'à ce qu'il soit tué.

    -n: Nombre d'itérations limité comme: -n nombre Spécifie le nombre maximum d'itérations, ou de trames, que top doit produire avant de se terminer.

    Il s'agit de la commande supérieure ajustée qui imprime la sortie une seule fois, puis se termine:

    $ top -b -n 1

  3. Je connais le PID que je veux regarder, donc je vais ajouter une restriction en haut, donc il imprime des données uniquement sur ce processus:

    $ top -b -n 1 -p 2569

  4. Même en mode batch, top imprime toujours un en-tête, contenant des statistiques diverses à l'échelle du système comme la disponibilité, la mémoire libre / l'échange, etc. Je n'en ai pas besoin. Tout ce dont j'ai besoin, c'est d'une seule ligne - celle qui contient des données sur mon processus, donc je vais la couper de la sortie entière comme ceci:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    Comme vous pouvez le voir, j'ai la deuxième ligne de 1.

  5. Je vais rediriger cette ligne vers awk pour extraire uniquement les colonnes dont j'ai besoin:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. Jusqu'à présent, je faisais ces manipulations en ligne de commande, maintenant c'est le moment d'ajouter de la persistance et de la flexibilité à notre cas particulier codé en dur. Je déplace toute la ligne dans un script shell simple. Je l'appellerai 3top , le nom est souligné car il sera utilisé plus tard:

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. Le numéro PID est codé en dur, voici comment faire pour que le script l'accepte comme argument de ligne de commande:

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    Pour faire des statistiques d'affichage 3top sur le PID 2569, il doit être appelé comme ceci:

    $ ./3top 2569

  8. Je veux également que le pourcentage soit affiché après la charge du processeur, donc je règle mon script 3top comme ceci:

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    J'ai redirigé la sortie entière d'une chaîne de commandes (connectées via des tuyaux) dans une variable. Ensuite, je l'imprime en utilisant l'écho et j'ajoute un «%» à la fin, car la charge du processeur est le dernier champ

  9. À ce stade, j'ai un script batch qui accepte un PID comme argument et imprime les statistiques une fois. Vous voulez plutôt une surveillance en temps réel? C'est facile, car la montre peut le faire! Exécutez le script comme ceci:

    $ watch -n 1 3top 2569

    Il effectuera une surveillance en temps réel en exécutant 3top une fois par seconde.

vtest
la source
11
L'utilisateur est sous OS X et n'a pas de Gnu top. option ou syntaxe invalide: -b . Aucune idée pourquoi cela a été voté à plusieurs reprises.
Daniel Beck
5
Gnu top(in procps) ne peut pas être installé à l'aide de Homebrew, MacPorts ou Fink et ne peut pas être compilé à partir de la source à l'aide de makeou cc top.c.
Daniel Beck
2

Le topformat d'affichage est personnalisable, mais il n'existe aucun moyen de spécifier les options d'affichage sur la ligne de commande. Si vous êtes inventif, cependant, vous pouvez probablement faire ce dont vous avez besoin en manipulant intelligemment le ~/.toprcfichier.

En supposant que vous n'avez pas encore personnalisé l'affichage de top(et que vous n'avez pas de ~/.toprcfichier):

  1. Lancer top.
  2. Appuyez fpour entrer en mode de sélection de champ.
  3. Pour chaque champ qui a un *côté que vous ne voulez pas, appuyez sur la lettre correspondante pour désélectionner ce champ. Par exemple, appuyez sur epour désélectionner le User Namechamp. Lorsque vous avez terminé, vous ne devriez avoir un *côté Process Id, CPU usageet Command name/line.
  4. Appuyez sur Spacepour revenir à la fenêtre principale.
  5. Appuyez sur W(c'est-à-dire Shift+ w) pour enregistrer la disposition actuelle dans votre ~/.toprcfichier.
  6. Quittez top, puis relancez pour vérifier que vos paramètres sont enregistrés.
  7. Lorsque vous souhaitez revenir à la mise en page par défaut, renommez ~/.toprcquelque chose comme ~/min.toprcavant de lancer top. Lorsque vous souhaitez basculer vers la disposition minimale, renommez ~/min.toprc-la ~/.toprcavant de lancer top.

Ce changement de nom et ce lancement de fichier toppeuvent probablement être transformés en un simple script shell par quelqu'un avec une once d'expérience et de connaissances en plus que moi. Vous aurez besoin d'une attention particulière si votre topmise en page régulière a déjà été personnalisée.

William Jackson
la source
Est-il possible d'ajouter un filtre (même manuellement) à .toprc? J'aime ajouter le filtre RUID>999au démarrage.
Dr Beco