![如何使用 sed 打印命令输出的一部分](https://linux22.com/image/169697/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20sed%20%E6%89%93%E5%8D%B0%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86.png)
我正在尝试打印命令输出的一部分:
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
orcut
因为我需要在各种服务中运行它并且脚本是不同的。
我尝试使用sed
选择 2 个字符之间的字符串(如true
和-Dspring
)sed -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
标志禁止打印任何输出,但p
sed 表达式末尾的 将会打印与规则匹配的任何内容。该表达式用于
\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
即使它是-Xms256m
or-Xmx4096m
或者 即使它以千兆字节为单位指定,例如-Xms1g
or -Xmx8g
,这也将起作用。您可以直接在文件或输出上运行它。
答案3
您可以尝试使用grep
:
grep -o "\-Xms[0-9]*m \-Xmx[0-9]*m" file
输出
-Xms1024m -Xmx1024m