gpt4 book ai didi

perl - grep 3个最新事件以及该事件周围的一些提示

转载 作者:行者123 更新时间:2023-12-02 09:18:44 28 4
gpt4 key购买 nike

我有一个类似的文件:

exception: anythinggggg...
exception: anythinggggg...
abchdhjsdhsd
ygsuhesnkc
exception: anythingggg...
exception: anything...
..
..

我想grep最近2次出现exception关键字以及它之前的3行和之后的3行。

我正在使用类似的东西
grep -C 3 exception | tail -12

我在这里使用尾号-12,因为我希望每次出现6行,最近出现2行。当异常的发生距离很远时,这很好用,但是如果说两次都是连续的,那么我的行就没用了。
abdgjsd
abdgjsd
abdgjsd
abdgjsd
abdgjsd
abdgjsd
abdgjsd
abdgjsd
exception
exception
exception
abcd

在上述情况下,它给了我
abdgjsd
abdgjsd
abdgjsd
exception
exception
exception
abcd

但是,我想要的是
abdgjsd
exception
exception -----------------> OUTPUT FOR FIRST OCCURRENCE
exception
abcd

abdgjsd
abdgjsd
exception-----------------> OUTPUT FOR SECOND OCCURRENCE
exception
exception
abcd

还有另一种方法吗?我可能还可以指定出现次数,而不仅是grep行,还可以指定一些输出。

最佳答案

您得到的输出是因为grep在下一个匹配项时停止打印上下文(-C)。我没有看到如何使其表现出其他方式。

下面的脚本(写在命令行上)读取整个文件并形成一行行。然后遍历它,并为每个匹配项打印出两行,或者直到数组的开始/结束。

perl -MList::Util=min,max -0777 -wnE'
@m = split /\n/;
for (0..$#m) {
if ($m[$_] =~ /exception/) {
$bi = max(0,$_-2);
$ei = min($_+2, $#m);
say for @m[$bi..$ei];
say "---"
}
}
' input.txt

打印 ---以便于查看输出。这将打印所需的输出。
-0777选项使它将整个文件插入到 $_变量中,该变量由换行符表示为 split。迭代遍历数组索引( $#m@m的最后一个元素的索引)。 $bi$ei是要打印的开始/结束索引,在数组的开始和结尾附近不能为+/- 2。

可以将输出通过管道传递到 tail,但这不能自动进行:如果在最后两行中存在匹配项,则输出行将减少(一或两)行,因此需要知道精确截止的输入。或者在脚本 @idx = grep { $m[$_] =~ /exception/} for 0..$#m;中找到匹配的索引,并在条件中使用该索引仅打印最后两个。

如果您要使用类似的代码,请将该脚本编写为脚本。然后将所有行直接读取到数组中,提供命令行选项(例如 -C中的 grep)等。

维持逐行处理会使工作复杂得多。我们需要跟踪比赛,以便阅读后可以打印以下几行。但是在这里,我们需要多个这样的记录-如果下一个匹配项位于要打印的以下行中,则也是如此。

关于perl - grep 3个最新事件以及该事件周围的一些提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491833/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com