Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk查找与所有模式匹配的所有单词_Bash_Awk - Fatal编程技术网

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也是。