我写了下面的脚本来查找匹配的字符串。
#!/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,因为其他参数都依赖于这个逻辑。
谢谢。
答案 0 :(得分:2)
您有两个问题,都涉及+
令牌。 +
是扩展的正则表达式模式,匹配一个或多个字符。
在变量decalaration中,您有str='XX:+UseCMSInitiatingOccupancyOnly'
并且您正在使用它作为Regex模式。然后问题是它会匹配:
一次或多次,但你想要按字面意思匹配它。所以声明为:
str='XX:\+UseCMSInitiatingOccupancyOnly'
在Regex模式中,最后有[^ ]+
,但输入字符串以UseCMSInitiatingOccupancyOnly
结尾,因此不匹配。所以你需要[^ ]*
。
示例:强>
$ str='XX:\+UseCMSInitiatingOccupancyOnly'
$ grep -Eo "\-${str}[^ ]*" <<<'-XX:+UseCMSInitiatingOccupancyOnly'
-XX:+UseCMSInitiatingOccupancyOnly