Bash 使用awk查找与所有模式匹配的所有单词
给定以制表符分隔的输入,如下所示:Bash 使用awk查找与所有模式匹配的所有单词,bash,awk,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
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
我将如何处理?可以考虑使用<代码> GRP > <代码> -o>代码>,这将提取匹配:
% grep -oE '(vpc|elb|eipalloc)-[^ ]*' data.txt
vpc-abcdefg
elb-foo-bar-baz
vpc-123455
eipalloc-bar
我知道它没有给出确切的输出格式,但可能可以吗 < P>可以考虑使用<代码> GRP > <代码> -o>代码>,这将提取匹配:
% grep -oE '(vpc|elb|eipalloc)-[^ ]*' data.txt
vpc-abcdefg
elb-foo-bar-baz
vpc-123455
eipalloc-bar
我知道它没有给出确切的输出格式,但可能可以吗 试试这个(其中gash.txt
是您的输入文件):
试试这个(其中gash.txt
是您的输入文件):
另一个
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
另一个
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
如果您的意思是“从”
vpc-
、elb-
等开始”,那么为什么不在-
上拆分呢。到目前为止你试过什么?这不是代码编写服务。我看不出-
上的拆分对我有什么帮助。您可以在-
上使用split()
,然后测试第一个元素。我假设您指定的模式是glob构造-awk
使用扩展正则表达式。到目前为止,您尝试了什么?wrt我该怎么做?
-购买Arnold Robbins的《有效的Awk编程》,第四版。阅读前几页,然后编写一个awk脚本来做你想做的事情。如果你的意思是“从”vpc-
、elb-
等开始”,那么为什么不在-
上拆分呢。到目前为止你试过什么?这不是代码编写服务。我看不出-
上的拆分对我有什么帮助。您可以在-
上使用split()
,然后测试第一个元素。我假设您指定的模式是glob构造-awk
使用扩展正则表达式。到目前为止,您尝试了什么?wrt我该怎么做?
-购买Arnold Robbins的《有效的Awk编程》,第四版。阅读前几页,然后编写一个awk脚本来做你想做的事情。我也考虑过这种方法,但我似乎无法在同一行中获得所有的vpc-*
匹配,以此类推。@StephenChu:vac-*
是一个全局构造,grep
采用正则表达式(RE)。在术语中,vpc-*
表示“vpc后跟零个或多个连字符”。中的*
重新限定其左侧的模式或字符,这与globbing中的不同。我理解。我不想混淆问题解决者来区分*
或[a-z0-9]
,因为这不是我的问题。我也考虑过这种方法,但我似乎无法在同一行中获得所有vpc-*
匹配项,以此类推。@StephenChu:vac-*
是一种全局结构,grep
采用正则表达式(RE)。在术语中,vpc-*
表示“vpc后跟零个或多个连字符”。中的*
重新限定其左侧的模式或字符,这与globbing中的不同。我理解。我不想混淆问题解决者来区分*
或[a-z0-9]
,因为这不是我的问题。为什么你要告诉awk使用stdin作为脚本文件,然后使用here doc来提供脚本,而不仅仅是awk'script'gash.txt
?此外,如果一个字段只包含“vpc”而不是OP希望的“vpc-”,那么这将不正确匹配。您也没有使用n
,因此没有设置它的意义,split()的第三个参数是regexp,而不是字符串,因此您应该使用regexp,而不是字符串分隔符:split($i,a,/-/)
@EdMorton:许多人喜欢将awk
嵌入bash脚本中,例如,文件名可能是使用bash
(而bash
是这个问题的标签)。拥有一个单独的文件会使代码管理更加困难,这是对here doc效率低下的折衷。我在-
上进行了拆分,因此如果后面没有连字符(已测试),它将不会拾取vac
。对于单个字符,/
是可选的-它们没有任何区别。我不是建议为脚本使用单独的文件,我是建议使用awk'script'文件
的常规awk语法,而不是将其与awk-f-文件不必要地复杂化。为什么要告诉awk使用stdin作为脚本文件然后使用here doc来提供脚本,而不仅仅是awk'script'gash.txt
?另外,如果一个字段只包含“vpc”而不是OP想要的“vpc-”,那么这将不正确匹配。您也没有使用n
,因此没有必要为split()设置它和第三个参数是一个regexp,而不是字符串,因此您应该使用regexp,而不是字符串,分隔符:split($i,a,/-/)
@EdMorton:许多人喜欢在bash脚本中嵌入awk
,例如,文件名可以使用bash
(而bash
是这个问题的标记)。有一个单独的文件会使代码管理更加困难,这是对here文档效率低下的折衷。我在-
上拆分,因此如果后面没有连字符(已测试),它将不会拾取vac
。对于单个字符,/
是可选的-它们没有任何区别。我不建议为脚本使用单独的文件,我建议使用awk'script'文件
的常规awk语法,而不是使awk-f-文件变得不必要的复杂。感谢此解决方案n也是。