Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
Perl grep的“从这个到那个”触发器语义?_Perl_Awk_Grep - Fatal编程技术网

Perl grep的“从这个到那个”触发器语义?

Perl grep的“从这个到那个”触发器语义?,perl,awk,grep,Perl,Awk,Grep,grep允许使用-a、-B和-C选项查看匹配的上下文,例如 grep -B 3 -A 10 "WARNING" MyApp.log perl one Liner允许使用表单中的双稳态翻转操作符轻松提取文本,即在开始行和结束行之间,每个行匹配不同的regexp perl -ne '(/^WARNING/../^$/) && print' MyApp.log 但是除了编写一个更复杂的脚本之外,没有明显的方法来包含上下文行——这绝对不是一个在命令行上快速使用的

grep允许使用-a、-B和-C选项查看匹配的上下文,例如

grep -B 3 -A 10 "WARNING" MyApp.log 
perl one Liner允许使用表单中的双稳态翻转操作符轻松提取文本,即在开始行和结束行之间,每个行匹配不同的regexp

perl -ne '(/^WARNING/../^$/) && print' MyApp.log
但是除了编写一个更复杂的脚本之外,没有明显的方法来包含上下文行——这绝对不是一个在命令行上快速使用的特别解决方案


grep/perl中是否有我所缺少的功能,或者第三个工具,允许结合触发器语义和上下文行?

如果我没有理解您的问题,您希望打印出与正则表达式匹配的行前N行开始的块,然后打印到下一个空行和后面的M行

这实际上很简单,可以使用好的旧ed:

$cat foo.log 第1行 第2行 第3行 第4行 警戒线 第5行 第6行 第7行 第8行 第9行 第10行 第11行 警戒线 第12行 第13行 第14行 $printf“%s\n”g/^WARNING/-3,/^$/+1p'| ed-s foo.log 第2行 第3行 第4行 警戒线 第5行 第6行 第7行 第9行 第10行 第11行 警戒线 第12行 第13行 如您所见,此特定调用打印出每个警告之前的3行,直到下一个空行之后的一行。但是,对于非常大的文件来说,这不是一个好的解决方案,因为ed加载整个文件。如果是这样的话,你需要的东西,保持滚动窗口的线。下面是一个跟踪上下文的perl示例:

perl-ne'push@lines,$\; 如果/^WARNING/./^$/{$in_warn=1} 移位@行如果$in_warn&&@lines>3; 如果$in_warn&/^$/{$end_line=$.+1} 如果$end_行==$。{print@lines;@lines=;$in_warn=0}'foo.log
如果我没弄错你的问题,你想在匹配正则表达式的行之前打印出N行开始的块,然后打印到下一个空行,然后打印出M行

这实际上很简单,可以使用好的旧ed:

$cat foo.log 第1行 第2行 第3行 第4行 警戒线 第5行 第6行 第7行 第8行 第9行 第10行 第11行 警戒线 第12行 第13行 第14行 $printf“%s\n”g/^WARNING/-3,/^$/+1p'| ed-s foo.log 第2行 第3行 第4行 警戒线 第5行 第6行 第7行 第9行 第10行 第11行 警戒线 第12行 第13行 如您所见,此特定调用打印出每个警告之前的3行,直到下一个空行之后的一行。但是,对于非常大的文件来说,这不是一个好的解决方案,因为ed加载整个文件。如果是这样的话,你需要的东西,保持滚动窗口的线。下面是一个跟踪上下文的perl示例:

perl-ne'push@lines,$\; 如果/^WARNING/./^$/{$in_warn=1} 移位@行如果$in_warn&&@lines>3; 如果$in_warn&/^$/{$end_line=$.+1} 如果$end_行==$。{print@lines;@lines=;$in_warn=0}'foo.log
替代实施:

perl-sne' 按@buf,$\ux; $in|warn |=/^WARNING/; 打印splice@buf如果$in_warn | |$to_print->0; shift@buf如果@buf>$B; 如果$in_warn&&/^$/{$in_warn=0;$to_print=$A;} '--B=3-A=3
这一个在内存中最多保留B+1行。它还使用-s允许使用参数指定上下文的大小。

替代实现:

perl-sne' 按@buf,$\ux; $in|warn |=/^WARNING/; 打印splice@buf如果$in_warn | |$to_print->0; shift@buf如果@buf>$B; 如果$in_warn&&/^$/{$in_warn=0;$to_print=$A;} '--B=3-A=3
这一个在内存中最多保留B+1行。它还使用-s来允许使用参数指定上下文的大小。

我不认为有,没有。似乎你要求的是一个相当复杂的行为,我不确定你到底想要什么,因此它可能需要一个程序,而不是现成的功能。考虑到Perl在这方面的能力,它可能相当紧凑,但我无法想象任何东西可以作为一个调用或操作符提供它。如果您希望您的问题包括简明的、可测试的样本输入和预期的输出,那么我们可以向您展示如何执行您试图执行的任何操作。请务必告诉我们您是否需要字符串或regexp匹配、整行、整字或部分匹配,并在示例输入/输出中包含重叠、嵌套和不完整的范围,这样您就不会得到实际问题以外的其他问题的答案。另外,请告诉我们您的输入文件通常有多大,以便我们了解将整个输入读入内存的解决方案是否合理,以及您是否有GNU工具。有一个一行程序发布,但它使用的是ed,它确实会先将整个文件读入内存,所以YMMV。要求一行通常不鼓励回答,因为这意味着你喜欢简洁而不是一切真正重要的清晰
、健壮性、效率、可移植性等。。您还没有看到很多解决方案,因为您还没有提供示例输入/输出,也没有告诉is您需要正则表达式与字符串匹配、部分与完整、以及如何处理重叠范围等,正如我在前面的评论中所讨论的。如果我们不知道您的需求是什么,我们就不能发布解决方案。我认为没有。似乎您要求的是一个相当复杂的行为,我不确定您到底想要什么,因此可能需要一个程序,而不是现成的功能。考虑到Perl在这方面的能力,它可能相当紧凑,但我无法想象任何东西可以作为一个调用或操作符提供它。如果您希望您的问题包括简明的、可测试的样本输入和预期的输出,那么我们可以向您展示如何执行您试图执行的任何操作。请务必告诉我们您是否需要字符串或regexp匹配、整行、整字或部分匹配,并在示例输入/输出中包含重叠、嵌套和不完整的范围,这样您就不会得到实际问题以外的其他问题的答案。另外,请告诉我们您的输入文件通常有多大,以便我们了解将整个输入读入内存的解决方案是否合理,以及您是否有GNU工具。有一个一行程序发布,但它使用的是ed,它确实会先将整个文件读入内存,所以YMMV。要求一行通常不鼓励回答,因为这意味着你喜欢简洁,而不是一切真正重要的东西:清晰性、健壮性、效率、可移植性等等。。您还没有看到很多解决方案,因为您还没有提供示例输入/输出,也没有告诉is您需要正则表达式与字符串匹配、部分与完整、以及如何处理重叠范围等,正如我在前面的评论中所讨论的。如果我们不知道您的要求,我们无法发布解决方案@行=;->打印splice@lines:打印@行@行=;->打印splice@lines :