web-dev-qa-db-ja.com

psコマンドにkbではなくmbでメモリを表示させる方法は?

Linuxのpsコマンドは、rssのようなさまざまなメモリ使用量をデフォルトで表示します。 ls -s --human-readableのようにmbまたはgbで表示する方法はありますか?

10
balki

申し訳ありませんが、オプション付きの純粋なpsコマンドだけでは実現できません。ただし、awkなどの一部のテキストプロセッサを使用して、必要な処理を行うことができます。

_ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'
_

これはpsからの結果であり、最初の行を除くすべての行で、通常はKBである5番目の列を置き換え、MBにMサフィックスを追加します。

エイリアスにして。bashrcファイルに保存すると、mypsのように呼び出すことができます。

ほとんどの人は、フォーマットを保持する方法、または他の単位と精度を使用する方法を尋ねています。

単純なバージョンでは、_column -t_出力フィルターを使用できます。

_ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t
_

ただし、これは最後の列のスペースを正しく認識しません。残念ながら、テキストのフォーマットを処理し、printfのような形式で独自のフォーマット文字列を準備する必要があります。

_ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'
_

説明:

  • _NR==1_条件は、最初の行のみ(ヘッダー)です。オリジナルのps出力を使用して、COMMANDがどこから始まっているかを判別します。
    • _o=$0_は、後で使用できるように、変更されていない行全体を格納します
    • a=match($0,$11)は、11番目のフィールドの位置を検索します(これは、COMMAND列が元の出力で開始する場所でなければなりません)
  • _NR>1_は次の行(データ)用です。 5番目のフィールドを変更します:
    • $5=int(10*$5/1024)/10"M"は、値を小数点以下1桁のメガバイトに変更し、接尾辞「M」を追加します。
    • printfはすべてのフィールドを列のようなフレーバーで表示します:
      • _%-10s_は、文字列の場合はs、10文字幅の場合は_10_、左揃えの場合は_-_を意味します
      • _%8s_は、文字列の場合はs、8文字幅の場合は_8_を意味します。このフィールドの_-_出力がないため、右揃えになります。
    • substr(o, a)は、前の条件で計算された位置oから始まる元の行のサブストリング(したがって、以前に格納されたa)を取得するため、スペースを保持したままコマンド出力を表示できます。
19
DevilaN