静的列と動的列番号の両方に対して次のコマンドの出力形式を再指定するには、awkを使用する必要があります。
ps -eopid,lstart,cmd | grep java |grep -v grep
以下は、awkコマンドのサンプル入力です。
17524 Wed May 9 08:50:37 2018 /opt/java/latest/bin/java -client -Xms256m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=256m -Dweblogic.Name=AdminServer -Djava.security.policy=/app/oracle/wls1036/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.system.BootIdentityFile=/projects/domainName/servers/AdminServer/security/boot.properties -Dweblogic.nodemanager.ServiceEnabled=true -Xverify:none -da -Dplatform.home=/app/oracle/wls1036/wlserver_10.3 -Dwls.home=/app/oracle/wls1036/wlserver_10.3/server -Dweblogic.home=/app/oracle/wls1036/wlserver_10.3/server -Ddomain.home=/projects/domainName -Does.client.home=/app/oracle/wls1036/oesclient -Doracle.home=/app/oracle/wls1036/oesclient -Doracle.security.jps.config=/projects/mydomain/config/oeswlssmconfig/AdminServer/jps-config.xml -Dweblogic.management.discover=true -Dwlw.iterativeDev= -Dwlw.testConsole= -Dwlw.logErrorsToConsole= -Dweblogic.ext.dirs=/app/oracle/wls1036/patch_wls1036/profiles/default/sysext_manifest_classpath:/app/oracle/wls1036/patch_ocp371/profiles/default/sysext_manifest_classpath weblogic.Server
出力例:
24519 Wed May 9 23:50:09 2018 -Dweblogic.Name=AdminServer
問題:awkを使用して列番号に基づいて最初のPID、開始日、時刻の値を印刷できますが、場合によっては最後の値の列番号が異なる場合があります。から)。 "-Dweblogic.Name=" キーワードを含む対応する列番号に対して検索された最後の値を印刷し、既存の出力に追加するにはどうすればよいですか。列番号と列検索の出力を結合すると例外が発生します。この出力形式をより簡単に指定できる方法(sed、grep、cutなど)も歓迎します。
答え1
たぶんDweblogicをgrepしてからsedすることもできます。
search="-Dweblogic.Name="
ps -eopid,lstart,cmd | \
grep "java.*$search" | \
sed -E 's#([^/]* )/.*('"$search"'[^ ]*).*#\1\2#'
答え2
列を取得するにはループを使用します
| awk '{for(i=NF;i>1;i--)
if ( $i ~ /-Dweblogic.name/ ) { wln=$i; break } ;
printf "... %s ...",wln}'
どこ
NF
表現されたフィールドの数。for( )
構文は行末から始まりまで繰り返されます。$i ~ /-Dweblogic.name/
-Dweblogic.name=admin1 , -Dweblogic.name=otheradmin と一致します (/^-D/ が自分のものと一致しないようにすることもできます)。
grep java | grep -v grep
魔女がgrep [j]ava
grep自体を削除せず(そして同僚を驚かせるように)提案してもいいですか?
| awk '/java/ {...} '
または最大引数の数を使用して:
| awk '/java/ && NF>10 { ... }'
答え3
使用幸せ(以前のPerl_6)
raku -ne 'my @a = .words; put "@a[0..5] @a.grep(/^ \-Dweblogic\.Name\= /)" if .words > 6;'
入力例:
17524 Wed May 9 08:50:37 2018 /opt/java/latest/bin/java -client -Xms256m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=256m -Dweblogic.Name=AdminServer -Djava.security.policy=/app/oracle/wls1036/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.system.BootIdentityFile=/projects/domainName/servers/AdminServer/security/boot.properties -Dweblogic.nodemanager.ServiceEnabled=true -Xverify:none -da -Dplatform.home=/app/oracle/wls1036/wlserver_10.3 -Dwls.home=/app/oracle/wls1036/wlserver_10.3/server -Dweblogic.home=/app/oracle/wls1036/wlserver_10.3/server -Ddomain.home=/projects/domainName -Does.client.home=/app/oracle/wls1036/oesclient -Doracle.home=/app/oracle/wls1036/oesclient -Doracle.security.jps.config=/projects/mydomain/config/oeswlssmconfig/AdminServer/jps-config.xml -Dweblogic.management.discover=true -Dwlw.iterativeDev= -Dwlw.testConsole= -Dwlw.logErrorsToConsole= -Dweblogic.ext.dirs=/app/oracle/wls1036/patch_wls1036/profiles/default/sysext_manifest_classpath:/app/oracle/wls1036/patch_ocp371/profiles/default/sysext_manifest_classpath weblogic.Server
出力例:
17524 Wed May 9 08:50:37 2018 -Dweblogic.Name=AdminServer
つまり、-ne
行ごとの入力は、スペースで区切られた入力に分割して配列words
に割り当てられます。@a
その後、最初の6列(単語[0..5]
)がoutput
で、grep
正規表現に一致するping完了単語が表示されます/^ \-Dweblogic\.Name\= /
(次のように書くこともできます/^ "-Dweblogic.Name=" /
)。
上記のコードは入力で短い行または空白行を処理しますが、/^ \-Dweblogic\.Name\= /
最初の6列(PIDとタイムスタンプ)が見つからない場合でも印刷します。$_
Rakuのテーマ変数を使用してこの問題を克服する次のコードを使用することをお勧めします。
raku -ne 'my @a = .words; $_ = @a.grep(/^ \-Dweblogic\.Name\= /); put "@a[0..5] $_" if $_;'