GNU/Linux >> Linux の 問題 >  >> Linux

ディスプレイのテーブルをうまく揃える方法は?

表示したい独自のプロパティを持つpsコマンドとして機能するスクリプトを作成しようとしています。これがpsコマンドでのプロセスの外観であると言います:

sas 24431     1  0 Oct10 ?        00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs

以下のように表示したい:

UID  PID    APPNAME
sas  24431  -Dapp.name=myApp
sas  24432  -Dapp.name=myApp2
sas  24433  -Dapp.name=myApp3

注: app.name プロパティは、psコマンドから抽出されたコマンド引数です

これが私のスクリプトです:

echo -e "PIDtUSERIDttAPPNAME"
ps -u $USER -f |grep "java"|grep -v "grep"|
while read LINE 
do 
  #Get pid from the line
  PID=$(cut -d" " -f2 <<< $LINE);
  #Get parameter value called "-Dapp.name or -DprojectName" 
  #from the ps command for the process
  APPNAME=$(ps -f $PID | awk 'BEGIN {RS=" "}; /-Dapp.name|-DprojectName/');
  USERID=$(cut -d" " -f1 <<< $LINE);

 echo -e $PID"t"$USERID"t"$APPNAME;
done;

今のところ、それは私が望むように機能します。しかし、時々アライメントがねじ込まれます。また、このスクリプトを1行のコマンドに最適化できますか?

助けていただければ幸いです。

承認された回答:

また、このスクリプトを1行のコマンドに最適化できますか?

-oの使用を検討します psのオプション 対象のフィールドのみを(可能な限り)出力し、javaに一致するように後処理するコマンド 必要なプロセスと特定のコマンド引数–

のようなもの
ps -u $USER -o uname=,pid=,args= | 
  gawk -vOFS='t' '/java/ {print $1,$2,substr($0,match($0,"-D(app[.]name)|(projectName)[^[:space:]]*"),RLENGTH)}'

またはおそらくperlでこのようなもの (免責事項:私のperlの知識は大ざっぱです

ps -u $USER -o uname=,pid=,args= | 
  perl -anle 'print join "t", @F[0], @F[1], grep /-D(app[.]name)|(projectName)/,@F if /java/'

Linux
  1. Rsyncコマンドをスケジュールする方法は?

  2. Linuxlsコマンド

  3. Linux で netstat コマンドを使用する方法 (例を含む)

  1. Linuxでtypecommand(コマンドに関する情報を表示)を使用する方法

  2. Linuxコマンドラインでファイルの特定の行を表示する方法

  3. Linux でルーティング テーブルを表示する方法

  1. コマンドが失敗した場合の終了方法

  2. aws s3 ls コマンドからファイルのみを表示するには?

  3. Linuxのsh(bashではない)のコマンドプロンプトで現在のパスを表示するには?