
コマンド出力の一部を印刷しようとしています。
cat script.sh | grep Xmx
java -jar -Duser.language=en -Djava.awt.headless=true -Xms1024m -Xmx1024m -Dspring.profiles -Dspring.cloud.config.uri ...*
私はそれをリストする必要があります-Xms1024m -Xmx1024m
。
さまざまなサービスで実行する必要があり、スクリプトも異なるため、awk
ORは使用できません。cut
2つの文字sed
の間で選択文字列を使用してみましたが、動作しません。機能しない理由は、サービスごとにスクリプトが異なるためです。一部には「-Djava.awt.headless = true」フラグがあり、他の一部にはありません。true
-Dspring
sed -e 's/.*true\(.*\)-Dspring/\1/'
sed
正しい構文の使用に関する洞察を提供してください。
答え1
上記のコメントに基づいて、常に2つのパラメータを一緒に使用し、順序は次のように仮定し、次のコマンドを使用できます。
sed -n -e 's/.*\s\(-Xms\S*\s*-Xmx\S*\).*/\1/p' script.sh
何が起こるかは次のとおりです。
この
-n
フラグは出力が印刷されるのを防ぎますが、ルールに一致p
する内容はすべて sed 式の末尾に印刷されます。この式は、
\s
空白\S
以外の文字に適用されます。式の最初の部分は、
.*\s
括弧内のパターンの前の空白文字まで行の先頭をキャプチャする必要があります(キャプチャグループ)。-Xms\S*
最初の引数と一致します。で始まり、-Xms
スペース\S*
内のすべてのアイテムと一致します(例:「1000m」または「1.5G」)。\s*
空白文字が0個以上あります(\s\s*
分離保証)。-Xmx\S*
目的の2番目の引数を再び次の空白まで一致させます。キャプチャグループをオフにし、残りの行を無視してキャプチャグループに置き換えます。
正規表現を実行する他の方法は、おそらく何十ものものです。しかし、テストするときに最初に浮かんで効果があった方法はこれでした。
答え2
2つの文字列は常に互いに隣に表示されるため、次のコマンドを使用できます。
grep -o "\-Xms[0-9]*[g,m].*[0-9][g,m]" script.sh
出力:
-Xms1024m -Xmx1024m
これは、-Xms256m
またはまたはなど-Xmx4096m
のギガバイトとして指定されている場合にも機能します。ファイルまたは出力から直接実行できます。-Xms1g
-Xmx8g
答え3
以下を試すことができますgrep
。
grep -o "\-Xms[0-9]*m \-Xmx[0-9]*m" file
出力
-Xms1024m -Xmx1024m