使用awk查找匹配所有模式的所有单词

时间:2016-06-09 04:55:58

标签: bash awk

给定一个制表符分隔的输入,如下所示:

us-west-2       vpc-abcdefg  42   elb-foo-bar-baz
us-east-1       foo     vpc-123455      eipalloc-bar

我想使用awk进行一些模式匹配,以便在输入中找到与vpc-*elb-*eipalloc-*匹配的所有字词。我还希望awk只能一次读取输入。

我的输出应该是以空格分隔的匹配值:

vpc-abcdef vpc-123455
elb-foo-bar-baz
eipalloc-bar

我该怎么做呢?

3 个答案:

答案 0 :(得分:2)

试试这个(gash.txt是你的输入文件):

awk -f - gash.txt << '__END__'
    BEGIN {
        tags["vpc"] = ""
        tags["elb"] = ""
        tags["eipalloc"] = ""
    }
    { for (i=1; i <= NF; i++) {
          n = split($i, a, "-")
          if (a[1] in tags)
              print $i
      }
    }

__END__

BEGIN块中的关联数组可能是一种矫枉过正,但它可以让将来更容易添加更多目标。

编辑:

我意识到我没有按照要求的相同风格制作输出,道歉。使用该关联数组变得相当容易:

awk -f - gash.txt << '__END__'
    BEGIN {
        tags["vpc"] = ""
        tags["elb"] = ""
        tags["eipalloc"] = ""
    }
    { for (i=1; i <= NF; i++) {
          n = split($i, a, /-/)
          if (a[1] in tags)
              tags[a[1]] = tags[a[1]] $i " "
      }
    }
    END {
        for (item in tags)
            print tags[item]
    }

__END__

答案 1 :(得分:0)

可以考虑将grep-o一起使用以提取匹配项:

% grep -oE '(vpc|elb|eipalloc)-[^ ]*' data.txt
vpc-abcdefg
elb-foo-bar-baz
vpc-123455
eipalloc-bar

我知道它没有提供确切的输出格式,但它可能没问题?

答案 2 :(得分:0)

另一个awk

$ awk -v RS='\t|\n' 'BEGIN{split("vpc- elb- eipalloc-",ks)} 
                          {for(k in ks) if($0~ks[k]) a[k]=a[k]?a[k] FS $0:$0}
                       END{for(k in a) print a[k]}' file

vpc-abcdefg vpc-123455
elb-foo-bar-baz
eipalloc-bar