BASH:扩展的正则表达式grep问题

时间:2016-06-22 09:51:24

标签: regex 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"

命令,jvmmon -pid "$(pgrep java)" -c "print vm information"产生outout,其中包含一个名为-XX:+UseCMSInitiatingOccupancyOnly的字符串,但我无法获得输出,它是空的。

让我们说jvmmon命令的输出是-XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark

注意:我必须使用grep -E,因为其他参数都依赖于这个逻辑。

谢谢。

1 个答案:

答案 0 :(得分:2)

您有两个问题,都涉及+令牌。 +是扩展的正则表达式模式,匹配一个或多个字符。

  • 在变量decalaration中,您有str='XX:+UseCMSInitiatingOccupancyOnly'并且您正在使用它作为Regex模式。然后问题是它会匹配:一次或多次,但你想要按字面意思匹配它。所以声明为:

    str='XX:\+UseCMSInitiatingOccupancyOnly'
    
  • 在Regex模式中,最后有[^ ]+,但输入字符串以UseCMSInitiatingOccupancyOnly结尾,因此不匹配。所以你需要[^ ]*

示例:

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