Gma*_*man 12 command-line bash grep sed awk
我有一个字符串
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
Run Code Online (Sandbox Code Playgroud)
并要提取的词qa
后面-Dspring.profiles.active
。
我将字符串保存在一个文件 text.txt 中,只是为了演示它。
当我做
grep -r -o "spring.profiles.active=" text.txt
Run Code Online (Sandbox Code Playgroud)
结果是 spring.profiles.active=
这个词并不总是qa
,它可能是prod
或dev
。
我想做的是找到这个词spring.profiles.active
,然后在=
提取那个词之后。
我想为此编写 shell 脚本,因为我使用这个词来配置服务器上的其他项目。
这可能吗,如果可以,我该怎么做。
hee*_*ayl 20
您可以grep
与 PCRE ( -P
) 一起使用:
grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
Run Code Online (Sandbox Code Playgroud)
spring.profiles.active=
将逐字匹配此子字符串,\K
将丢弃匹配
[^ ]+
将选择所需的部分,即之后的部分spring.profiles.active=
,直到下一个空间
对于文件:
grep -Po 'spring.profiles.active=\K[^ ]+' file.txt
Run Code Online (Sandbox Code Playgroud)
例子:
% grep -Po 'spring.profiles.active=\K[^ ]+' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
Run Code Online (Sandbox Code Playgroud)
sed
将采用类似的逻辑:
sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'.....string.....'
Run Code Online (Sandbox Code Playgroud)
例子:
% sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
Run Code Online (Sandbox Code Playgroud)
处理错误:
在您的脚本中,您可能希望处理没有匹配项的情况,换句话说,您的原始字符串不包含spring.profiles.active=
. 在上面的sed
示例中,您获得了整个原始字符串,这可能会产生问题:
% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256
Run Code Online (Sandbox Code Playgroud)
如果您希望在没有匹配项时获取空字符串,请将-n
选项添加到sed
命令中,并将p
选项添加到sed
s
命令中,如下所示:
% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256')"
% echo $var
qa
Run Code Online (Sandbox Code Playgroud)
然后你可以测试 $var 是否为空。