ps
get 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
答え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
$NF
awk
ps
答え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]*
これらすべての情報を収集するには、直接参照する必要があります。