我有一个字符串
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
并想提取后面的qa
单词-Dspring.profiles.active
。
我将字符串保存在文件 text.txt 中只是为了演示它。
当我做
grep -r -o "spring.profiles.active=" text.txt
结果是spring.profiles.active=
这个词并不总是qa
,它可能是prod
或dev
。
我想做的是找到这个词spring.profiles.active
并在=
提取那个词之后。
我想编写 shell 脚本,因为我使用这个词来配置服务器上的其他项目。
这可能吗?如果可以,我该怎么做。
您可以
grep
与 PCRE (-P
) 一起使用:spring.profiles.active=
将按字面匹配此子字符串,\K
将丢弃匹配[^ ]+
将选择所需的部分,即之后的部分spring.profiles.active=
,直到下一个空格对于一个文件:
例子:
sed
会采取类似的逻辑:例子:
处理错误:
在您的脚本中,您可能想要处理没有匹配项的情况,换句话说,您的原始字符串不包含
spring.profiles.active=
. 在上面的sed
示例中,您获得了整个原始字符串,这可能会产生问题:如果您希望在没有匹配时获取空字符串,请将
-n
选项添加到sed
命令并将p
选项添加到sed
s
命令,如下所示:然后你可以测试 $var 是否为空。
使用
awk
或者
例子
我将在混合中加入一个 Perl:
-l
:启用自动行结束处理。它有两个独立的效果。首先,当与 -n 或 -p 一起使用时,它会自动 chomps $/(输入记录分隔符)。其次,它将 $\(输出记录分隔符)指定为 octnum 的值,以便任何打印语句都将重新添加该分隔符。如果省略 octnum,则将 $\ 设置为 $/ 的当前值。-a
: 与 -n 或 -p 一起使用时打开自动拆分模式。对@F 数组的隐式拆分命令是在由-n 或-p 生成的隐式while 循环内的第一件事。n
: 使 Perl 假设你的程序有以下循环,这使得它迭代文件名参数,有点像 sed -n 或 awk:-e
: 可用于输入一行程序。