2010-09-02 6 views
3

Mon objectif est de trouver le processus qui consomme le plus de CPU et de RAM en écrivant un script. J'ai réussi à extraire l'information de la commande TOP, mais j'ai du mal à analyser la sortie.Comment lire l'entrée de la sortie standard d'une autre commande (pipe) dans un script shell Linux?

La commande suivante,

top -b -n 1 | tail -n +8 | head -n 1 

Affichera quelque chose de semblable à cette ligne unique,

915 root  20 0 209m 74m 8644 S 8 7.7 5:27.57 Xorg 

Je veux que cette ligne de texte à la liste des arguments pour mon script. Je me rends compte que je dois le lire du STDIN mais, je veux lire le mot de sortie ci-dessus mot par mot, ou argument par argument comme si il a été donné à partir de la ligne de commande.

echo " Parameter is ${2} ${3}" 

Répondre

1

Obtenez la ligne dans une variable:

OUTPUT=`top -b -n 1 | tail -n +8 | head -n 1` 

Convertir en un tableau:

LIST=($OUTPUT) 

Et la sortie des champs:

echo ${LIST[1]} 
echo ${LIST[2]} 
+0

thnx homme! J'ai essayé pendant des heures. –

1

sauver la ligne de sortie avec comprimant tous les caractères blancs:

LINE=$(top -b -n 1 | tail -n +8 | head -n 1 | tr -s ' ') 

Et puis utilisez cut pour obtenir la partie que vous voulez:

echo " Parameter is $(echo $LINE | cut -d' ' -f2) $(echo $LINE | cut -d' ' -f3)" 

etc.

accordé , pas la façon la plus élégante, mais le plus rapide que je peux trouver

2

Utilisez set -- pour forcer les arguments à deviennent des paramètres de position.

set -- $(top -b -n 1 | tail -n +8 | head -n 1) 
echo " Parameter is ${2} ${3}" 
2

Juste pour le fun :)

top -b -n1 | head -8 | tail -2 | awk ' 
{ 
    if (NR==1) { 
     print "\nHey teacher, leave those kids alone! - Pink Floyd ;)\n"; 
     print $2,$1,$9,$10; 
     next; 
    } 
    print $2,$1,$9,$10; 
}' 

Ou si vous voulez un autre format de rapport:

top -b -n1 | head -8 | tail -1 | awk '{ printf "User: %s\nPID: %s\nCPU Usage: %s\nMEM Usage: %s\n", $2,$1,$9,$10 }' 
1

Compte tenu

# 915 root  20 0 209m 74m 8644 S 8 7.7 5:27.57 Xorg 

vous pouvez le lire tout droit dans meaninfully variables nommées:

top -b -n 1 | tail -n +8 | head -n 1 | 
    read XPID XUSERID XPRIORITY XVIRTUAL XRESIDENT XSHARED XSTATE XCPU XMEM XTIME XCOMMAND 

(seul problème est de savoir si les valeurs deviennent si grandes colonnes se touchent ... dans ce cas, vous devez utiliser quelque chose comme coupé avec des chiffres de la colonne hardcoded plutôt que de compter sur la séparation des espaces)

Questions connexes