web-dev-qa-db-ja.com

Bashでstdoutの線幅を動的にトリミングする

最近、psコマンドを試してみましたが、長いパスが次の行(または2行)に折り返され、読みにくくなる場合があります。 ps出力を別のプログラムにパイプして、出力をx文字数に制限したい。

これが私がこれまで持ってきたものですが、うまくいきません:

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

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

このタイプの構文をbashで機能させる方法はありますか?

9
lentils

以下の作品:

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つのアプローチはそれを解決します。

さらに別のオプションがあります。上記のコマンドでは、sttyのstdinとstdoutの両方がリダイレクトされますが、そのstderrはリダイレクトされません。それでも、ターミナルを指します。奇妙なことに、sttyは、入力としてstderrが指定されている場合にも機能します。

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

zshbashmkshなどの一部のシェルは、$COLUMNS変数をターミナルの幅に自動的に設定するため、stty here。

psのすべての実装で、非標準(BSDタイプ)構文をサポートして、端末の幅を自分で照会できるようにしました。私はあなたがそうしていないことに驚いています。ただし、COLUMNSenvironment変数の内容が表示されることを期待しています。

だからあなたはできる:

export COLUMNS; ps aux

そうでない場合、

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

行を折り返さないように端末に指示することもできます。

tput rmam
ps aux
8

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からanotherフィルターを使用して出力を解析できるようになることがよくあります。不要。もちろん、peopleは、ほとんどme。を意味します

上記の-outputオペランドを使用すると、psが表示する列をフィルタリングできます。また、=assigmentを追加するときに、列に自由に名前を付けることもできます。割り当てを空のままにして、ターゲット-process $pidを渡します。そのため、psからの出力は、$pidコマンド名とそのargsのみです。呼び出し時。そして-oは、psが何を表示するか、または何を表示しないかを定義する方法の表面をかろうじて引っ掻きます。これは、特に次の方法で、私が推奨する方向です。

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

Root(実際の有効な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=

4
mikeserv