Bashで標準出力ライン幅を動的にトリミングする

Bashで標準出力ライン幅を動的にトリミングする

最近このコマンドを試しましたが、ps時には非常に長いパスが次の行(または2行)に渡り、読みにくくなることがありました。ps出力を別のプログラムにパイプして出力をx文字数に制限したいと思います。

これまでに行った作業は次のとおりです。しかし、うまく動作しません。

ps aux | cut -c1-$(stty size | cut -d' ' -f2)

$(stty size | cut -d' ' -f2)これは167と評価されますが、有効な入力ではないようですcut

Bashでこのタイプの構文を操作する方法はありますか?

答え1

一部のシェルはzsh自動的にbash変数を端末の幅にmksh設定するため、ここで呼び出す必要はありません。$COLUMNSstty

私が試したすべての実装は、それps自体で端末の幅を照会するための非標準(BSDタイプ)構文をサポートしています。そうではないことに驚きました。私が見るものは何ですかCOLUMNS 環境変数がありますが。

だからあなたはこれを行うことができます:

export COLUMNS; ps aux

そうでなければ、

ps aux | cut -c"1-$COLUMNS"

端末にラップしないように指示することもできます。

tput rmam
ps aux

答え2

以下はうまくいきます:

ps aux | cut -c1-$(stty size </dev/tty | cut -d' ' -f2)

これはまた働きます:

v=$(stty size | cut -d' ' -f2) ; ps aux | cut -c1-$v

stty問題は、正常に動作するために標準入力にttyが必要であることです。上記の2つの方法でこの問題を解決できます。

別のオプションがあります。上記のコマンドでは、stdinとstdoutの両方がリダイレクトされますが、sttystderrはそうではありません。それでも端末を指します。奇妙なことに、sttystderrを入力として与えるとうまくいきます。

ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)

答え3

ps出力をよりよく処理することもできます。

ps --width ${n:-$COLUMNS} ${opts} #set ps terminal width

ps -ww ${opts} #no word wrap

ps -o ${only_interesting_output} ${opts} #trim output

ps必要に応じて、出力を仕様に合わせて解析するように求められます。

もちろん改行しないと、情報が失われる問題が発生します。実際に使用するにはすべてのプロセスが必要ですか?もしそうなら、ポケットベルで開いてみてください。

ps ww ${opts} | $PAGER

そうでない場合は、見たい内容を指定してください。

ps -o args= -p $pid

または、ps端末に明示的に通知することもできます--width

man ps

...

w 広い出力。無限の幅を得るには、このオプションを2回使用します。

-w 広い出力。無限の幅を得るには、このオプションを2回使用します。

--width n 画面の幅を設定します。

--width別途のフィルターや付帯工程なしでお客様が要求する仕様を正確に満たす製品です。(これは-aux出力をさらに混乱させる可能性があります。)$COLUMNS上記とStephaneが指摘したように動的に動作します。

|pipeしかし、人々がしばしばこれらの不要なフィルタを追加してフィットしようとすることは注目に値します。その他フィルタを使用して出力を解析しますが、これは不要な場合があります。もちろん、人々私の言葉は主に私。

上記の出力オペランドを使用すると、表示される列をフィルタリングでき、分布を追加するときに必要に応じて列名を指定することもできます-o。割り当てを空白にしてターゲットプロセスを提供するため、唯一の出力はコマンド名と呼び出し時に呼び出される名前です。これは、表示する項目と表示しない項目を定義する方法の表面的な部分にすぎません。これが私が推奨する方向です。特に次のようになります。ps=-p$pidps$pidargs-ops

man ps

... 

BSD構文を使用して、システム内のすべてのプロセスを確認してください。

ps ax

ps axu

印刷プロセスツリー:

ps -ejH

ps axjf

スレッドに関する情報を取得するには:

ps -eLf

ps axms

セキュリティ情報を取得するには:

ps -eo euser,ruser,suser,fuser,f,comm,label

ps axZ

ps -eM

ユーザー形式(実際の有効ID)のルートとして実行されているすべてのプロセスを表示するには、次のようにします。

ps -U root -u root u

カスタム形式を使用して各プロセスを表示するには、次の手順を実行します。

ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm

ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps -Ao pid,tt,user,fname,tmout,f,wchan

syslogdのプロセスIDのみを印刷します。

ps -C syslogd -o pid=

PID 42の名前だけを印刷してください:

ps -p 42 -o comm=

関連情報