使用 grep/sed/awk 从字符串中提取单词

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,它可能是proddev

我想做的是找到这个词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 是否为空。