gpt4 book ai didi

linux - 打印所有行直到匹配给定模式的最后一行的简洁方法

转载 作者:IT王子 更新时间:2023-10-29 00:23:09 29 4
gpt4 key购买 nike

我正试图找到一种简洁的单层 shell ,它能给我所有文件中的行直到某种模式。

用例是将所有行转储到日志文件中,直到我发现一些表示服务器已经重启的标记。

这是一个愚蠢的 shell-only 方法:

tail_file_to_pattern() {
pattern=$1
file=$2

tail -n$((1 + $(wc -l $file | cut -d' ' -f1) - $(grep -E -n "$pattern" $file | tail -n 1 | cut -d ':' -f1))) $file
}

一种稍微更可靠的 Perl 方法,将文件放在标准输入上:

perl -we '
push @lines => $_ while <STDIN>;
my $pattern = $ARGV[0];
END {
my $last_match = 0;
for (my $i = @lines; $i--;) {
$last_match = $i and last if $lines[$i] =~ /$pattern/;
}
print @lines[$last_match..$#lines];
}
'

当然,您可以更有效地打开文件,寻找结束并返回,直到找到匹配的行。

第一次出现时打印所有内容很容易,例如:

sed -n '/PATTERN/,$p'

但到最后为止,我还没有想出打印所有内容的方法发生。

最佳答案

这是一个仅限 sed 的解决方案。要打印 $file 中的每一行,匹配 $pattern 的最后一行开始:

sed -e "H;/${pattern}/h" -e '$g;$!d' $file

请注意,与您的示例一样,这仅在文件包含模式时才能正常工作。否则,它会输出整个文件。

这是它的作用的分解,括号中是 sed 命令:

  • [H] 将每一行附加到 sed 的“保留空间”,但不要将其回显到标准输出 [d]。
  • 当我们遇到模式时,[h] 丢弃保持空间并从匹配行重新开始。
  • 当我们到达文件末尾时,将保持空间复制到模式空间 [g],以便它回显到标准输出。

另请注意,对于非常大的文件,它可能会变慢,因为任何单遍解决方案都需要在内存中保留一堆行。

关于linux - 打印所有行直到匹配给定模式的最后一行的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8962629/

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