この質問は重複しているように見えるかもしれませんが、一見するとそうです。
もちろん、固定量を抽出するための1行のコードを書くのにはもはや必要ありません。続けてデータソースの行(この例では5行)。例top
:
$ top -b -n1 | awk 'BEGIN {printf "%23s %7s\n","cpu","mem"} NR==8,NR==12 {printf "%-16s %6s%% %6s%%\n",$12,$9,$10}'
これは、システムで最もCPU集約的なプロセスを表示し、追加の列にメモリ使用量を印刷するための非常に便利なシングルライナーです。
これまではとても良かったのですが…でもそうではありません。それ細かい。このリストを取得するには、以下をtop
表示する必要があります(システムの負荷が低いとき)。それ自体このリストのプロセスとして。通話中だからそんなことはしたくない間隔そして定期的に卵を産みますtop
(短期間でも)。私たち全員が知っているように、8号線(NR==8)。しかし、他の仮想デスクトップの2番目の仮想デスクトップがtop
端末に残っているので、リストもめちゃくちゃになるとどうなりますか?この場合、top
両方のプロセスを省略する必要があるため、最後に処理する行は14になります。
したがって、この出力を改善し、top
その中のすべての行をフィルタリングするにはカウンタが必要なようです(多分?で終わるfor
ループかもしれませんbreak
)。残念ながら、forループを使用した私の試みは、指示どおりにi = <number>
各行を複数回印刷するため、これまでの成果はありませんでしたi
。
私は動作する多少ハッキングされた解決策を思いつきましたが、より複雑な場合には適していない可能性があります。
top -b -n1 | grep -v ' \btop\b$' | awk 'BEGIN {printf "%23s %7s\n","cpu","mem"} NR==8,NR==12 {printf "%-16s %6s%% %6s%%\n",$12,$9,$10}'
(注:2番目の列のユーザー名も「top」の場合、不要な結果が発生する可能性があります。)
awk
とにかく、これを実行して削除する方法について手がかりを得ることはできますかgrep
?
よろしくお願いします。
答え1
これはあなたの質問に対する答えではありませんが、
まったく異なる方法で解決したい問題を解決します。
完全なコマンドは次のとおりです(下記のサンプル出力を参照)。
ps -o comm,%cpu,%mem --sort -%cpu -A | head -6
その部分を説明します。
ps
出力をさらに制御するため- 必要な3列のみを印刷してください。
-o comm,%cpu,%mem
ps
データが--sort -%cpu
CPUによって内部的に逆順にソートされるようにします。- すべてのプロセスを一覧表示
-A
- タイトルと結果の最初の5行を表示
| head -6
出力は、最初のコマンドの出力と似ています。
$ ps -o comm,%cpu,%mem --sort -%cpu -A | head -6
COMMAND %CPU %MEM
firefox 8.9 15.5
Xorg 1.3 5.6
parcellite 0.3 1.6
compiz 0.2 1.8
konsole 0.1 0.9
プロセスはps
リスト全体にリストされます。親PIDに基づいてプロセスを除外できます。
他のプロセスを除外するには、top
コマンド名に基づいて実行できます。
すべてのプロセスを選択すると、-A
次のものに置き換えられます-N ...
。
ps ... -N --ppid $$ -C top
これでプロセスを除外する必要があるため、-N
一致するプロセスを除く他のすべてのプロセスを選択するために使用します。
を除外するには、ps
これを使用して現在の対話型シェルを親プロセスとして使用するため、そのシェルの親pidであるPPIDを持つことになります。現在のシェルのPIDはです$$
。
したがって、--ppid $$
現在のシェルのすべてのサブプロセスと一致すると、1つしかないことがわかりますps
。
top
また、同じコンピューター上の他のモニターで実行できるプロセスを除外したいと思います。コマンド名とを組み合わせてこれを行います-C top
。
ps
プロセス自体(およびそのプロセスのみ)とすべてのプロセスを除く完全なコマンドはtop
次のとおりです。
ps -o comm,%cpu,%mem --sort -%cpu -N --ppid $$ -C top | head -6
答え2
最高司令部|アーク「スタート」タイトル印刷;個数=5} NR>=8 { if ($0 ~ /あなたのトップ正規表現/)次へ。 印刷フィールド; if(--count == 0)終了} '
#8で始まるすべての行で一致する場合はtop
無視します。それ以外の場合は、必要な部分を印刷してください。top
5行目(不一致)を印刷して終了します。