awk:最後の行番号が異なる可能性がある固定数の行を抽出する

awk:最後の行番号が異なる可能性がある固定数の行を抽出する

この質問は重複しているように見えるかもしれませんが、一見するとそうです。
もちろん、固定量を抽出するための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 -%cpuCPUによって内部的に逆順にソートされるようにします。
  • すべてのプロセスを一覧表示-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無視します。それ以外の場合は、必要な部分を印刷してください。top5行目(不一致)を印刷して終了します。

関連情報