正規表現を使用してawk列を選択するには?

正規表現を使用してawk列を選択するには?

サーバー上で多くのJavaプロセスが実行されており、これは開発サーバーであるため、複数の環境が実行されています。

特定の環境のプロセスを一覧表示する場合は、javaコマンドがパラメータが多くてかなり長いため、これを読みやすい短いリストを提供するようにします。

ps -ef|grep ENV-NAME|grep -v grep|awk '{print $2 " " $32}'

これにより、実行中のJavaクラスのプロセスIDと名前が印刷されます。

ただし、ご存知のように、これは常に同じ列(32)のJavaクラス名に依存します。

プロセスの1つにパラメータを追加すると、明らかに間違った列が選択され、プロセスのリストはもはや意味がありません。

Javaクラス名は常にcom.company.start.name

列番号の代わりに正規表現を使用して正しい列を選択するために、awkでこの情報を使用できますか?

答え1

正規表現に基づいて正確に列を選択することはできませんが、次のようにできます。

ps -ef | awk ' /[E]NV-NAME/{ match($0, /[a-z]+\.[a-z]+\.[a-z]+\.[a-z]+/); print( $2 " " substr($0, RSTART, RLENGTH)) }'

読みやすくするためにgrepを削除し、複数行に変更しました。これらすべてを関数にキャプチャしたいかもしれません。

PS:私は最初にawk正規表現に触れたので、この説明を改善することができますmatch

PPSこの[E]NV-NAME構文は、正規表現が出力psで自己一致するのを防ぐのに便利な近道です。grep皮肉なことに、この特定のタスクには実際に必要でも有用でもありません。

関連情報