Awk用于打印第一个图案和第二个图案之间的线条,其中第二个图案出现在第一个图案的上方和下方

Awk用于打印第一个图案和第二个图案之间的线条,其中第二个图案出现在第一个图案的上方和下方,awk,Awk,我试图打印所有行,包括第一个匹配,直到第二个匹配的第一次出现,其中第二个匹配出现在第一个匹配的上方和下方 我所拥有的文件包含的记录由以下空行分隔 host host1 key1 value key2 value key3 value host host2 key1 value key2 value key3 value key4 value key5 valu

我试图打印所有行,包括第一个匹配,直到第二个匹配的第一次出现,其中第二个匹配出现在第一个匹配的上方和下方

我所拥有的文件包含的记录由以下空行分隔

host      host1  
key1      value  
key2      value  
key3      value  

host      host2  
key1      value  
key2      value  
key3      value  
key4      value  
key5      value  

host      host3  
key1      value  
key2      **aaaa**  
key3      value  

host      host3  
key1      value  
key2      value  
假设我的搜索模式是“aaaa”。我想打印第一个匹配到“aaaa”的上面的行,直到空行,以及第一个匹配到“aaaa”的下面的行,直到空行。因此,搜索应输出:

host      host3  
key1      value  
key2      aaaa  
key3      value  

我不能使用grep,因为每条记录都包含不同的行数。

我想我找到了答案。对于寻找类似解决方案的任何人,您可以使用以下awk:

awk 'BEGIN{ RS="\n\n"; FS="\n"; } /aaaa/  {print}' << inputfile

awk'BEGIN{RS=“\n\n”FS=“\n”}/aaaa/{print}”我想我找到了答案。对于寻找类似解决方案的任何人,您可以使用以下awk:

awk 'BEGIN{ RS="\n\n"; FS="\n"; } /aaaa/  {print}' << inputfile

awk'BEGIN{RS=“\n\n”FS=“\n”}/aaaa/{print}”虽然这将产生您期望的输出,但由于多字符,它不必要地特定于gawk,使用不必要的输入重定向,毫无理由地设置FS,并冗余地指定默认行为。有关正确的方法,请参阅。虽然这将产生您期望的输出,但由于多字符、使用不必要的输入重定向、毫无理由地设置FS以及冗余地指定默认行为,因此它不必要地特定于gawk。请参阅以获得正确的方法。谢谢,这很有效。。。。如果记录之间存在多个匹配项,我如何在记录之间添加空行?还有一件事我如何使RS不区分大小写?要在输出记录之间打印空行,请添加
-v ORS='\n\n'
,由于RS为空,因此不区分大小写,因为不涉及大小写。如果您的意思是如何使regexp比较不区分大小写,这是GNU awk中的
tolower($0)~/aaaa/
或set
IGNORECASE=1
。谢谢Ed。最后,有一个配置文件,我们可以在其中设置默认的ORS值和IGNORECASE感谢它的工作。。。。如果记录之间存在多个匹配项,我如何在记录之间添加空行?还有一件事我如何使RS不区分大小写?要在输出记录之间打印空行,请添加
-v ORS='\n\n'
,由于RS为空,因此不区分大小写,因为不涉及大小写。如果您的意思是如何使regexp比较不区分大小写,这是GNU awk中的
tolower($0)~/aaaa/
或set
IGNORECASE=1
。谢谢Ed。最后有一个配置文件,我们可以在其中设置默认的ORS值和IGNORECASE