いくつかの出力の特定の列を強調表示する最良の方法を見つけようとしています。具体的に強調しようとしています。6位%cpu
コマンドの列(例:):
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu
私が一つ見つけたワイヤーここでは、色の追加を使用することが許可される同様のトピックですsed
。これが私がやりたいことですが、うまく動作しないようです。
これが私が今まで得たものです:
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head | sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/'
強調表示最初明るい黄色の柱。 6番目の列を得るために正規表現を操作しようとしていますが、動作しないようです。
同じスクリプトでハイライトを除いて同じことを行います。7番カラム(メモリ)。それで、この問題をより簡単に処理する方法があることを願っています。
答え1
ps
私のDebian 9には次のレポート(つまりps --version
レポート)がありますps from procps-ng 3.3.12
。マニュアルには次のように記載されています。
これは
ps
、書式設定コードとやや似たように機能するAIX書式記述子をサポートします。たとえば、次のコマンドを使用して一般的な基本出力を生成できます。printf(1)
printf(3)
ps -eo "%p %y %x %c"
この構文を使用すると、型に任意の文字列を含めることができることがわかりました。 AIXとAIX以外の形式記述子を混在させることは一般的には機能せず、問題の形式をAIXに完全に変換することはできません(AIXは、、、、、およびを置き換えますが、置き換えではpid
ないと思います)。幸いなことに、AIXまたはAIX以外の形式記述子をそれぞれ独立して使用することで、複数を使用できます。ppid
time
user
tty
%cpu
vsize
command
%mem
-o
-o
あなたの場合、強調したい列(%cpu
)をAIX形式の記述子()で表すことができます%C
。これにより、比較的簡単に強調できます。
ps -eo pid,ppid,time,user,tty -o $'\033[1;33m%C\033[0m ' -o %mem,vsize,command --sort -%cpu
ノート
$'…'
私は拡張のためにBashの構文を使用し、\033[1;33m
同様のps
文字列は拡張しません。あるいは、$(printf '…')
エスケープシーケンスを生成するために使用することもできます。- この形式には、強調表示された列を次の列と区別するための末尾のスペースが含まれます。
- この方法では、複数の連続した列を簡単に強調表示できます。
- 強調表示が始まる列をAIX形式の記述子として表示できない場合は、前の列が表示されることがあります。最初の強調表示された列を指定する書式の前に挿入する代わりに、前の列を指定する書式の末尾
\033[1;33m
に挿入できます。 \033[0m
同様に、最後に強調表示された列を指定する書式の末尾に挿入する代わりに、次の列を指定する書式の前に挿入できます。- 列間で色を切り替える必要があり、どちらの列もAIX形式記述子として表示できない場合は、正しいエスケープシーケンスを提供することが唯一の目的であるダミー列を中間に追加できます。任意の文字列を挿入するには、AIX 形式と同様の形式が必要です。そうでなければ、
ps
文字列をAIX以外の形式に解釈しようとします(失敗しなくても望むものではありません)。これは、提供された形式の拡張可能な項目が少なくとも1つ必要であることを意味します%?
(?
文字通りここではなくワイルドカードで)。
次の例では、仮想列を使用して必要な列を強調表示します。 「実際の」列は、AIX以外の形式を使用して説明されています(したがって、すべてAIX形式記述子に置き換えることはできませんが、解決策はまだ機能しています)。 「カラートランジション」形式を%%
知らせるために使用されます。 print 。したがって、(バックスペース)は各場合にすぐに印刷され、その後の出力は不要なものを上書きします。ps
%%
ps
%
\b
%
ps -eo pid,ppid,time,user,tty -o $'%%\b\033[1;33m' -o %cpu -o $'%%\b\033[0m ' -o %mem,vsize,command --sort -%cpu
必要に応じて、最後にダミーの列を置くことができます。この場合、フォーマットにはまだ末尾のスペースが必要です(不要なスペースを覆うために%
)。
同様に、ビジュアル区切り文字を作成することもできます。例:
ps -eo pid,ppid,time,user,tty -o $'%%\b|X| ' -o %cpu,%mem,vsize,command --sort -%cpu
この場合、AIX記述子を使用して隣接列を指定できるため、likeを使用する方が簡単で-o '%y |X| %C'
必要はありません%%\b
。ただし、これは通常、AIX形式記述子が隣接列を表現できない場合でもカスタム列を生成する方法です。
- 出力をさらに解析する
sed
場合(例:\033[0m
%%\b
このソリューションは移植性がありませんが、コードが次のものよりも優れていることがわかりました。この方法は次のとおりです。sed
。特に、さまざまな列にさまざまな色を適用する場合は、さらにそうです。前または中央に列を追加し、列を削除または再配置するのは簡単です。sed
正規表現を慎重に調整する必要があります。
答え2
ドンクリスティ非常に簡単な解決策が公開されました。最後の閉じる引用符の前に必要な列番号を追加するだけです。
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head | sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/6'