匹配同一行中的确切单词

时间:2018-09-20 07:09:19

标签: bash shell

在我的脚本上,执行特定命令后,我需要匹配两个单词。 我需要仔细研究 karaf-ids DEPLOYED

我使用了grep -F,但它与第一​​个单词和第二个单词不完全匹配

#helm ls
 NAME                    REVISION        UPDATED                         STATUS          CHART                   NAMESPACE
cantankerous-abalone    1               Mon Sep  3 14:54:53 2018        FAILED          karaf-0.0.215           karaf    
hissing-albatross       1               Mon Sep  3 14:57:14 2018        FAILED          karaf-0.0.215           karaf    
karaf-ids               1               Thu Sep 20 08:18:28 2018        DEPLOYED        karaf-ids-0.0.339       karaf-ids

我继续寻找解决方案...

5 个答案:

答案 0 :(得分:1)

awk '$1 == "karaf-ids" && $8 == "DEPLOYED"' 

打印符合这些条件的任何行。如果这不是您想要的,例如,添加诸如{ print $3, $4, $5, $6, $7 }之类的内容以仅打印日期。

答案 1 :(得分:0)

您可以执行以下操作:

<the-command-that generated given output > | awk 'BEGIN {printf "%-25s 
%s\n", "NAME", "STATUS"} {if (NR != 1) {printf "%-25s %s\n", $1, $8}}'

这将生成如下输出:

NAME                      STATUS
cantankerous-abalone      FAILED
hissing-albatross         FAILED
karaf-ids                 DEPLOYED

答案 2 :(得分:0)

这不是做这份工作吗?

grep '^karaf-ids\s.*\sDEPLOYED\s'

答案 3 :(得分:0)

如果您需要将两个单词(单词1和单词2)与grep进行匹配,则有2种选择:

如果单词顺序已知:

$ grep word1.*word2 file

或者如果订单未知:

$ grep word1 file | grep word2

在您的情况下,它们都可以工作。

如果要使用单词列表从文件(grep -F中进行搜索,则不能使用grep,请使用awk:

$ awk '
NR==FNR {
    a[$0]
    next
}
{
    for(i in a)
        if($0!~i)
            next
}1' list file

输出数据:

karaf-ids               1               Thu Sep 20 08:18:28 2018        DEPLOYED        karaf-ids-0.0.339       karaf-ids

对于部分匹配,所有解决方案都将失败。

答案 4 :(得分:0)

我没有使用第一个grep,因为如果我编写示例并进行示例,它将找到两者。而且我不想要,所以我使用awk

 helm ls |  awk "/(^| )$CHART_NAME( |$)/" |grep DEPLOYED

使用下面的命令,它将仅找到带有$ CHART_NAME和DEPLOYED的行