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


9

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

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

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

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

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


この仕事は私にとって。出力を提供できますか?
cuonglm 2014

動的な部分はどこですか?特定の条件で長さを変えたいですか?すべての出力を1つの最大長に制限したいようです

@awk_FTW状況に応じて、ウィンドウ設定が異なります。全画面表示では、幅は167ですが、他のサイズでは、もっと小さくする必要があります。そのため、sstyを呼び出してサイズを取得します。
レンズ豆14

試してみてくださいtput rmam; ps aux
ステファンChazelas

シェルによっては、好きzshksh93あるいはbash端末の幅を保存する$COLUMNS
ステファンChazelas

回答:


5

次の作品:

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とは、標準出力の両方上記のコマンドにリダイレクトされ、その標準エラー出力ではありません:それはまだ、端末へのポイント。奇妙なことに、stty入力としてstderrが指定されている場合にも機能します。

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

確かにそうです!これはまさに私が探していたものでした。気になるだけですが、なぜ最後にTティーを追加したのですか?
レンズ豆14

@lentilsおっと、teeデバッグ時に追加されました。もうなくなっています。
John1024 14

<&2は何を表していますか?私はその記法を見たことがありません。
レンズ豆14

@lentilsシェルでは、ファイルに番号が付けられます。ゼロは標準入力、1は標準出力、2は標準エラーを指します。この式<&2は、標準エラーから入力を取得することを意味します。
John1024 14

1
sttystdinで開いている端末の設定を取得します(stty < /dev/other-ttyたとえば、別の端末の設定を取得するために行います)。そのため、stdinがパイプであるか、または機能する場合に機能しないことは不思議ではありません<&2
ステファンChazelas

8

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

ps非標準(BSDタイプ)構文をサポートするために試したすべての実装は、端末の幅を自分で照会します。私はあなたがそうしていないことに驚いています。ただし、COLUMNS 環境変数の内容を確認すると思います。

だからあなたはできる:

export COLUMNS; ps aux

そうでない場合、

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

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

tput rmam
ps aux

4

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、上記とそれアウトステファン・ポイントとして示されているようにも動的に動作します。

しかし、おそらく注目に値しますが、人々がこれらの種類の不要なフィルターを追加しようとすることがよくあるので、別のフィルターを|pipe介して出力を解析し、不要である可能性が高い出力を解析できるようにします。もちろん、人々とは主に私を意味します。

-outputは、私が上記に言及する列をフィルタにあなたを可能にオペランドpsを表示し、あなたが追加したときに=assigmentを、あなたも、あなたのように列をしてください名前を付けることができます。私は割り当てを空のままにして、それをターゲット-pプロセスに渡した$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=

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.