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/
或setIGNORECASE=1
。谢谢Ed。最后,有一个配置文件,我们可以在其中设置默认的ORS值和IGNORECASE感谢它的工作。。。。如果记录之间存在多个匹配项,我如何在记录之间添加空行?还有一件事我如何使RS不区分大小写?要在输出记录之间打印空行,请添加-v ORS='\n\n'
,由于RS为空,因此不区分大小写,因为不涉及大小写。如果您的意思是如何使regexp比较不区分大小写,这是GNU awk中的tolower($0)~/aaaa/
或setIGNORECASE=1
。谢谢Ed。最后有一个配置文件,我们可以在其中设置默认的ORS值和IGNORECASE