2

Linux システムに関する情報を提供するコマンドを作成しようとしています。コマンドはワンライナーである必要があります。これは、割り込み、プロセス、およびコンテキスト スイッチの合計量を表す必要があります。

私はLinuxの世界にまったく慣れていないので、これは私にとって簡単なことではありません。これまでのところ、私はこれを見つけました:

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

問題は最後の部分、else にあります。$1 の値には興味がありませんが、$1 の項目の合計を知っておく必要があります。

$1 には次のようなものが含まれている必要があります。

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

しかし、これらすべての数値の合計を取得する方法がわかりません。bcに渡す必要があると思いますが、これを管理する方法がわかりません。

4

3 に答える 3

7

あなたのワンライナー:

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

この行の問題は、perl には暗黙の変数がなく$line、 と呼ばれることです$_。また、正規表現は=~、数値等価演算子ではなく結合演算子を使用して文字列に適用されます==。正規表現が一致しない場合、 if ステートメントが逆になります$1。これは、最後の正規表現の括弧でキャプチャされた文字列であるため、印刷したくありません。

perl はこれを問題なく処理できるため、catorも使用する必要はありません。grep

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

このワンライナーは、一致する行を「grep」し、「intr」行の一致のみを出力するという点で、行が行ったこととまったく同じことを行う必要があります。ctxt|intr|processes

特定の数値の合計を出力したい場合は、私にはまったく新しい質問のように感じますが、perlsum()のモジュールのサブルーチンを利用できます。List::Util例えば:

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

この場合、キャプチャされた文字列に数字のみが含まれるようにする必要があります。sum()は数値のリストを取るため、入力を分割する必要があります。

于 2013-02-13T13:08:05.400 に答える
3

これはどう:

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

bc通常、から呼び出す必要はありませんがperl、全体的なアプローチが「プロセスが多いほど良い」という理由があるかもしれません。

于 2013-02-13T12:57:05.957 に答える
-3
cat /proc/stat | grep -E 'ctxt|intr|processes' | 
    perl -nle 'if ($line == /^intr (.*)/) {print $_} else {print $1}' | 
    sed 's/ /+/g' | bc
于 2013-02-13T12:57:33.323 に答える