给定一个制表符分隔的输入,如下所示:
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
我该怎么做呢?
答案 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