ディスプレイテーブルの整列方法

ディスプレイテーブルの整列方法

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 "PID\tUSERID\t\tAPPNAME"
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

一般的なテーブルソートにはこのcolumnユーティリティが必要です。

たとえば、

(
 printf 'PID\tUSER\tAPPNAME\n'
 printf '%s\t%s\t%s\n' "1" "john" "foo bar"
 printf '%s\t%s\t%s\n' "12345678" "someone_with_a_long_name" "pop tart"
) | column -t -s $'\t'

結果:

PID       USER                      APPNAME
1         john                      foo bar
12345678  someone_with_a_long_name  pop tart

おすすめ記事