如何使用 sed 打印命令输出的一部分

如何使用 sed 打印命令输出的一部分

我正在尝试打印命令输出的一部分:

cat script.sh | grep Xmx 

java -jar -Duser.language=en -Djava.awt.headless=true -Xms1024m -Xmx1024m -Dspring.profiles -Dspring.cloud.config.uri ...*

我只需要列出来-Xms1024m -Xmx1024m

我无法使用awkorcut因为我需要在各种服务中运行它并且脚本是不同的。

我尝试使用sed选择 2 个字符之间的字符串(如true-Dspringsed -e 's/.*true\(.*\)-Dspring/\1/',但这不起作用。它不起作用的原因是每个服务的脚本都不同。有些有标志“-Djava.awt.headless = true”,而其他则没有。

请提供有关正确sed使用语法的一些见解。

答案1

根据您上面的评论,您将始终将两个参数放在一起,并且我假设顺序如图所示,您可以使用以下命令:

sed -n -e 's/.*\s\(-Xms\S*\s*-Xmx\S*\).*/\1/p' script.sh

这是发生的事情:

  • -n标志禁止打印任何输出,但psed 表达式末尾的 将会打印与规则匹配的任何内容。

  • 该表达式用于\s空白字符和\S非空白字符。

  • 表达式的第一部分.*\s应捕获行的开头,直到括号中的模式之前的空白字符(捕获组)

  • -Xms\S*将匹配第一个参数。它将以 开头-Xms,并且\S*将匹配空白以内的任何内容(例如,“1000m”或“1.5G”)

  • \s*有0个或多个空白字符(可以\s\s*保证有分隔)

  • -Xmx\S*匹配您想要的第二个参数,再次直到下一个空格

  • 我们关闭捕获组并忽略该行的其余部分,仅用捕获组替换。

可能还有其他十几种方法可以执行正则表达式,但这是我在测试它时首先想到并起作用的方法。

答案2

由于两个字符串总是会出现在彼此旁边,因此您可以使用以下命令:

grep -o "\-Xms[0-9]*[g,m].*[0-9][g,m]" script.sh

输出:

-Xms1024m -Xmx1024m

即使它是-Xms256mor-Xmx4096m或者 即使它以千兆字节为单位指定,例如-Xms1gor -Xmx8g,这也将起作用。您可以直接在文件或输出上运行它。

答案3

您可以尝试使用grep

grep -o "\-Xms[0-9]*m \-Xmx[0-9]*m" file

输出

-Xms1024m -Xmx1024m

相关内容