別の文字列を検索して文字列を取得する

別の文字列を検索して文字列を取得する

次のように複数のプロセスが実行されています。

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+'

-ogrep少なくとも1つの一致行ではなく、一致部分を出力するように指示するGNU拡張。

-Pgrepデフォルトの正規表現の代わりに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つ以上の空白文字、テキスト、-Number1つ以上の空白文字、1つ以上の数字が含まれている場合、行全体はキャプチャされた一連の数字(で囲まれた部分\( \))に置き換えられ、結果は次のようになります。印刷されました。
上記の順序が1行で複数回繰り返されると、最初の数字だけが印刷されます。

より簡潔なAWKの代替案は、-Numberデータ例に示されているように、次の数値シーケンスが単一のスペースで区切られていると仮定します。

awk -v RS=' ' '/^-Number$/ { getline; print; }'

これは、スペースで区切られた各単一文字列を1つのレコードとして扱います。-Numberこの文字列のみで構成されたレコードが見つかった場合は、次のレコードを読み取り、印刷します。

答え4

oEでgrepを使う

grep -oE "\-Number(.*?)\s-" | grep -oE [[:digit:]]+

-o ->一致する文字列のみ出力 -E ->拡張正規表現

関連情報