答え1
ps
AFAIKオプションを含む純粋なコマンドでは簡単に行うことはできません。しかし、例えば、いくつかのテキストプロセッサを使用してawk
所望のタスクを実行させることができる。
ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'
これは、結果を取得し、ps
最初の行を除く各行に対して通常KB単位の5番目の列を置き換え、MBにMサフィックスを追加します。
エイリアスとして作成して保存できます。.bashrcmyps
.
ほとんどの人は、フォーマットを保存する方法や他の単位と精度を使用する方法を尋ねます。
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
条件は最初の行(タイトル)にのみ適用されます。 COMMANDが始まる位置を決定するために、生のps出力を使用します。o=$0
後で使用するために変更されていない行全体を保存します。a=match($0,$11)
11番目のフィールドの位置を見つけます(これは元の出力でCOMMAND列の先頭でなければなりません)。
NR>1
次の行(データ)について。 5番目のフィールドを変更します。$5=int(10*$5/1024)/10"M"
値を小数点以下の1桁のメガバイトに変更し、「M」サフィックスを追加します。- printf はすべてのフィールドを列と同じように表示します。
%-10s
左揃えの10文字幅のs
文字列を表します。10
-
%8s
s
8文字の幅の文字列を表し、出力が8
ないため、-
フィールドは右揃えになります。
substr(o, a)
o
前の条件が評価された場所から始まり、元の行(したがって以前に保存された)のサブストリングを取得するため、a
スペースを維持しながらコマンド出力を表示できます。
答え2
私は同じ問題の解決策を見つけるためにここに来ました。驚くべきことに、まだ良い答えはありません。私はこのスレッドとオンラインで読んだ他のページに基づいて少し柔軟な修正をしました。
内容を読みやすくするために自動範囲機能を作成し、フィールドに使用しvsz
ましたrss
。
また、はい 実際の方法任意のフィールド区切り文字を強制的に使用しますps
。これが私がする方法です:
マンページ字幕のフィールド記述子を使用するAIX FORMAT DESCRIPTORS
と、文書化されていないように見えるトリックが見つかりましたps
。 USERやVSZなどの操作を実行すると、%
各出力行の前に文字が含まれているようです。試してみるとどうなるのだろうか。 1行に1つずつ表示します。いいですね。空白のないランダムな文字列はどうですか?はい! !%U
%z
%%
%
しかし、明らかにあなたは持つ%%
期待通りに動作するようにしてください。%
わからない。有効なフィールド記述子であることを確認するために、次ps
のすべての項目を解析しようとします。したがって、問題を避けるために%
文字列の末尾に保管するのが最も安全です。FOOBARBIGSTRINGBLABLA%%
これで、有効なデータの一部になる可能性が比較的低い文字列を思い出してください。特にこれをcmd
フィールドとして使用する場合はさらにそうです。zzz:::zzz
そうは思えません。%%
最後に追加の項目を追加して機能しましょう。zzz:::zzz%%
これは出力にzzz:::zzz%
。
awk
複数文字のフィールド区切り文字を処理できる出力を処理しており、awk
照会をzzz:::zzz%
フィールド区切り文字として指定します。
|head -n20
最後のステップは、|cut -c -250
出力を20行に制限し、250文字以降の各行を切り取り、端末をきれいに保つことです。実用的なスクリプトの目的でそれらを削除することもできます。
編集する:
この例を使用して、すべてのフィールドに基づいて並べ替えることができることを指摘するために変数を追加しました。フィールド名はps
マンページのタイトルの下にあります。STANDARD FORMAT SPECIFIERS
編集2: リクエストに応じて、任意のフィールド区切り文字がどのように機能するか、およびフィールド区切り文字を選択する理由の詳細な説明を追加しました。
実施例1
sortbyfield="rss"; fsep="-o zzz:::zzz%% -o"; ps ax o user:16 $fsep pid $fsep pcpu $fsep pmem $fsep vsz $fsep rss $fsep tty $fsep stat $fsep lstart $fsep time:16 $fsep cmd --sort -$sortbyfield | awk 'function setprefix(num){{n_suffix=1; while(num > 1000 && n_suffix < suffixes_len) {num /= 1024; n_suffix++;}; num=int(100*num)/100suffixes[n_suffix]}; return num} BEGIN{suffixes_len=split("kB MB GB TB PB EB ZB",suffixes);FS="zzz:::zzz%";} NR>1 {$5=setprefix($5);$6=setprefix($6); }{ printf "%-16s %6s %-5s %-5s %9s %9s %-8s %-8s %-25s %-18s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;}' |head -n20 |cut -c -250
出力:(少し整理された例)
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME CMD
gdm 1474 0.0 0.3 2.87GB 182.86MB tty1 Sl+ Sat Jun 18 01:31:44 2022 00:34:40 /usr/bin/gnome-shell
gdm 1370 0.0 0.0 171.3MB 34.31MB tty1 Sl+ Sat Jun 18 01:31:43 2022 00:01:56 /usr/libexec/Xorg vt1 -displayfd 3 -auth /run/user/42/gdm/Xauthority -background none -noreset -keeptty -verbose 3
gdm 1552 0.0 0.0 686.07MB 20.14MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:40 /usr/libexec/gsd-color
gdm 1577 0.0 0.0 870.49MB 19.53MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:01 /usr/libexec/gsd-media-keys
gdm 1538 0.0 0.0 531.81MB 18.51MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-xsettings
gdm 1541 0.0 0.0 539.53MB 18.5MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:04 /usr/libexec/gsd-power
gdm 1570 0.0 0.0 458.5MB 18.4MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-wacom
gdm 1500 0.0 0.0 386.57MB 17.94MB tty1 Sl Sat Jun 18 01:31:45 2022 00:00:00 /usr/libexec/ibus-x11 --kill-daemon
gdm 1537 0.0 0.0 386.13MB 17.92MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-clipboard
実施例2
やや簡潔なバージョン:
sortbyfield="rss"; fsep="-o zzz:::zzz%% -o"; ps ax o user:16 $fsep pid $fsep pcpu $fsep pmem $fsep vsz $fsep rss $fsep tty $fsep stat $fsep lstart $fsep time:16 $fsep comm --sort -$sortbyfield | awk 'function setprefix(num){{n_suffix=1; while(num > 1000 && n_suffix < suffixes_len) {num /= 1024; n_suffix++;}; num=int(100*num)/100suffixes[n_suffix]}; return num} BEGIN{suffixes_len=split("kB MB GB TB PB EB ZB",suffixes);FS="zzz:::zzz%";} NR>1 {$5=setprefix($5);$6=setprefix($6); }{ printf "%-16s %6s %-5s %-5s %9s %9s %-8s %-8s %-25s %-18s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;}' |head -n20 |cut -c -250
出力:(少し整理された例)
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
gdm 1474 0.0 0.3 2.87GB 182.86MB tty1 Sl+ Sat Jun 18 01:31:44 2022 00:34:40 gnome-shell
gdm 1370 0.0 0.0 171.3MB 34.31MB tty1 Sl+ Sat Jun 18 01:31:43 2022 00:01:56 Xorg
gdm 1552 0.0 0.0 686.07MB 20.14MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:40 gsd-color
gdm 1577 0.0 0.0 870.49MB 19.53MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:01 gsd-media-keys
gdm 1538 0.0 0.0 531.81MB 18.51MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-xsettings
gdm 1541 0.0 0.0 539.53MB 18.5MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:04 gsd-power
gdm 1570 0.0 0.0 458.5MB 18.4MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-wacom
gdm 1500 0.0 0.0 386.57MB 17.94MB tty1 Sl Sat Jun 18 01:31:45 2022 00:00:00 ibus-x11
gdm 1537 0.0 0.0 386.13MB 17.92MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-clipboard
これが誰かに役立つことを願っています!