2013-02-13 2 views
2

J'essaie d'écrire une commande qui me donne des informations sur un système Linux. La commande devrait être un seul doublure. Cela devrait représenter le nombre total d'interruptions, de processus et de commutateurs de contexte. Je suis assez nouveau dans le monde Linux, donc ce n'est pas un mince mince pour moi. Jusqu'à présent, j'ai trouvé ceci:Passez une partie de perl à bc

cat /proc/stat | grep -E 'ctxt|intr|processes' | \ 
perl -nle 'if ($line == /^intr (.*)/) {print $_} else {print $1}' 

Le problème est dans la dernière partie, l'autre. Je ne suis pas intéressé par la valeur de 1 $, mais je devrais connaître la somme des articles en 1 $.

$ 1 devrait contenir quelque chose comme:

8522774 17 6 0 0 0 0 2 0 1 0 1435117 21 103 0 84742 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Mais Je ne sais pas comment je pourrais obtenir la somme de tous ces chiffres. Je crois que je devrais le passer à bc, mais je ne sais pas comment gérer cela.

+1

C'est une utilisation redondante de 'cat'. Peut-être que vous devriez montrer l'entrée et la production attendue. Cela rendra cela environ 10 fois plus facile de vous aider. – TLP

Répondre

7

Votre one-liner:

cat /proc/stat | grep -E 'ctxt|intr|processes' | \ 
perl -nle 'if ($line == /^intr (.*)/) {print $_} else {print $1}' 

Le problème avec cette ligne est que Perl n'a aucune variable $line implicite, il est appelé $_. De plus, la regex est appliquée aux chaînes avec l'opérateur de liaison =~, et non l'opérateur d'égalité numérique ==. Votre if-instruction est inversée, si la regex ne correspond pas, vous ne voulez pas imprimer $1, parce que c'est la chaîne qui est capturée par des parenthèses dans votre dernière regex.

Vous n'avez pas non plus besoin d'utiliser cat ou grep, puisque perl peut gérer cela très bien.

perl -nlwe 'if (/ctxt|processes/) { print } 
      elsif (/^intr (.*)/ { print $1 }' /proc/stat 

Cette ligne unique devrait faire exactement ce que votre ligne a fait, en ce qu'il « greps » les lignes qui correspondent à ctxt|intr|processes, et imprime uniquement le match pour les lignes « intr ».

Si vous voulez imprimer la somme de certains nombres, ce qui me semble une toute nouvelle question, vous pouvez utiliser le sous-programme sum() du module List::Util en perl. .: par exemple

perl -MList::Util=sum -nlwe 'if (/ctxt|processes/) { print } 
      elsif (/^intr (.*)/ { print sum split ' ', $1 }' /proc/stat 

Dans ce cas, vous aurez besoin de compter sur votre chaîne capturée pour contenir que des chiffres. sum() prend une liste de nombres, c'est pourquoi nous devons diviser l'entrée.

3

Que diriez-vous ceci:

awk '/^intr/ {for(i=2;i<=NF;++i) sum+=$i; print "intr",sum} 
    /^processes|ctxt/ {print}' /proc/stat 

Vous n'avez pas l'habitude d'appeler bc de perl, mais peut-être il y a une raison pour votre approche globale étant « les plus processus, mieux ».

-3
cat /proc/stat | grep -E 'ctxt|intr|processes' | 
    perl -nle 'if ($line == /^intr (.*)/) {print $_} else {print $1}' | 
    sed 's/ /+/g' | bc 
+0

Quel est le problème avec cette sortie de commande? –

+3

Je n'ai pas downvote, mais la partie perl est toujours cassée, vous avez encore une utilisation redondante de cat, et vous clouer sur un autre processus à la fin au lieu de le manipuler avec perl. – TLP

Questions connexes