2016-06-22 16 views
1

以下のスクリプトを使って、一致する文字列を見つけました。BASH:拡張正規表現grepの問題

#!/usr/bin/env bash 
str='XX:+UseCMSInitiatingOccupancyOnly' 
echo "str :${str}" 
output=$(jvmmon -pid "$(pgrep java)" -c "print vm information" | grep -Eo "\-$str[^ ]+") 
echo "output : $output" 

コマンド、-XX:+UseCMSInitiatingOccupancyOnlyという名前の文字列が含まれていますが、私は出力を得るcouldntの、それが空であるjvmmon -pid "$(pgrep java)" -c "print vm information"農産物outout。

レッツは、そのjvmmonコマンドを入れて言う-XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark

。注:他のパラメータは、このロジックに依存しているように私はgrepのの-Eを使用しなければなりません。

ありがとうございます。

+0

この場合は 'grep'の望ましい結果は何ですか? – GMichael

+0

@GMichael、出力は-XXでなければなりません:+ UseCMSInitiatingOccupancyOnly –

+0

それはあなたに何を与えるでしょうか?あなたはすでにこの文字列を知っています。 – GMichael

答えて

2

2つの問題があり、いずれも+トークンです。 +は拡張Regexパターンであり、1つ以上の文字と一致します。

  • 可変デカレーションでは、str='XX:+UseCMSInitiatingOccupancyOnly'があり、これを正規表現パターンとして使用しています。それで問題は1回以上:とマッチしますが、文字通り一致させたいと思っています。だから、としてそれを宣言する:正規表現パターンでは

    str='XX:\+UseCMSInitiatingOccupancyOnly' 
    
  • 、あなたが最後に[^ ]+を持っていますが、入力文字列はそれほど一致していない、UseCMSInitiatingOccupancyOnlyで終了します。だから[^ ]*が必要です。

例:

$ str='XX:\+UseCMSInitiatingOccupancyOnly'       
$ grep -Eo "\-${str}[^ ]*" <<<'-XX:+UseCMSInitiatingOccupancyOnly' 
-XX:+UseCMSInitiatingOccupancyOnly