`ps`の出力を別のフィールドに解析する方法は?

`ps`の出力を別のフィールドに解析する方法は?

psget any fieldを使用するために出力を解析したいと思いますawk。フィールドはスペースで区切られているように見えますが、フィールドpsの値にはCOMMANDスペースがあることがよくあります。

ps出力に一意のフィールド区切り文字を使用するように指示する方法はありますか?マンページで一つも見つかりませんでしたps

そうでない場合は、現場で値を取得するにはどうすればよいですか?ありがとうございます。

答え1

型文字列パラメータを使用するときは、一意のフィールド区切り文字を明示的に指定できます。印刷()カスタム出力スタイル:

$ ps -o '%p,%a,%c,%y'
  PID,COMMAND                    ,COMMAND        ,TTY
15742,ps -o %p,%a,%c,%y          ,ps             ,pts/6
24719,-su                        ,bash           ,pts/6

答え2

まず、複数のスペースを単一のスペース(または他の文字)に置き換えることができます。バラよりこの問題これを達成する方法について。次に、これを使用cutして目的の列を選択できます。また、見ることができますこの問題

答え3

readシェルが残りのすべてのフィールドを最後の変数に入れ、最後にCOMMANDを印刷するという事実を利用できます。

ps -eo pid,cmd,tty,args | while read PID CMD TTY ARG; do echo $PID $CMD $TTY $ARG; done

出力を直接読み取るときに渡すか、または$ARG内部にawk接続できます。$4$NFawkps

答え4

すべてを最大限に埋め、次に「多くのスペース」を区切り文字として処理し、パイプまたは他の文字に変更してより精神的にすることができます。以下は、一般的に実行する操作を--format実行し-f、区切り文字を変更し、-Zスペースを含めることができる別のフィールドである「タブ」(一般的に実行するアクション)を追加してスペースを最後に移動するだけでは不十分です。を示しています。

ps -e --format "label:200 uid:200 pid:200 ppid:200 c:200 stime:200 tty:200 time:200 command:200" \
    | sed -r 's| {100,}|\||g'

しかし、これは副作用があるかもしれません...私のコンピュータで許可されているパディングの制限psは100から200の間のようです。他の場所では異なる場合があります。たぶん、1つのコマンドにスペースが多すぎる可能性があります。これが常に機能するという保証はありません。 (無人スクリプトなど)保証が必要な場合は、デフォルトでpsを再実装する必要があります。つまり、/proc/[0-9]*これらすべての情報を収集するには、直接参照する必要があります。

関連情報