次のように複数のプロセスが実行されています。
User 18870 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 1234 -c 1234-SM
User 18871 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 1264 -c 1264-SM
User 18872 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 1634 -c 1634-SM
User 18873 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 2334 -c 2334-SM
私は出力を取得したいだけです-Number 1234
。その数はプロセスによって異なります。したがって、次のように出力する必要があります。
-Number 1234
-Number 1264
-Number 1634
-Number 2334
それとも羊がいないのがいいと思います。
1234
1264
1634
2334
答え1
使用awk
awk '{print $21}'
$21
デフォルトの区切り文字が空白であることを考慮すると、予想される出力はどこにありますか?
$ echo "User 18870 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 1234 -c 1234-SM" | awk '{print $21}'
1234
答え2
GNUgrep
または互換製品を使用してください。
ps -wwAo args= | grep -Po '^java.* -Number\s+\K\S+'
-o
grep
少なくとも1つの一致行ではなく、一致部分を出力するように指示するGNU拡張。
-P
grep
デフォルトの正規表現の代わりにPerl準拠の正規表現を使用するように指示するもう1つのGNU拡張です。
\K
一致する部分の開始をリセットするために使用されるPerl正規表現演算子。したがって、一致する部分は、+
後に続く1つ以上の()スペースではなく、文字()のシーケンスです。\S
-Number<whitespaces>
ps -Ao args=
すべてのプロセスのすべてのパラメーターのリストをリストするPOSIXコマンド(スペースで連結)。一部の実装-w
でサポートされている拡張です。ps
より広く(多くのps
実装では、そうでなければ切り捨てられます。)
答え3
より安全で簡単な解決策は、プロセスを一覧表示するために使用するツールによって提供されるフィルタリング機能を使用することです。
つまり、sed
移植性と誤検出の最小化を考慮して、次のようにテキストを送信できます。
sed -n -e 's/.*[[:blank:]]\{1,\}-Number[[:blank:]]\{1,\}\([0123456789]\{1,\}\).*/\1/p'
行に1つ以上の空白文字、テキスト、-Number
1つ以上の空白文字、1つ以上の数字が含まれている場合、行全体はキャプチャされた一連の数字(で囲まれた部分\(
\)
)に置き換えられ、結果は次のようになります。印刷されました。
上記の順序が1行で複数回繰り返されると、最初の数字だけが印刷されます。
より簡潔なAWKの代替案は、-Number
データ例に示されているように、次の数値シーケンスが単一のスペースで区切られていると仮定します。
awk -v RS=' ' '/^-Number$/ { getline; print; }'
これは、スペースで区切られた各単一文字列を1つのレコードとして扱います。-Number
この文字列のみで構成されたレコードが見つかった場合は、次のレコードを読み取り、印刷します。
答え4
oEでgrepを使う
grep -oE "\-Number(.*?)\s-" | grep -oE [[:digit:]]+
-o ->一致する文字列のみ出力 -E ->拡張正規表現