linux – 简洁的方式将所有行打印到与给定模式匹配的最后一行

linux – 简洁的方式将所有行打印到与给定模式匹配的最后一行,第1张

概述我试图找到一个简洁的贝壳单线,它会给我所有的 文件中的行直到某个模式. 用例是将所有行转储到日志文件中,直到找到一些为止 表示服务器已重新启动的标记. 这是一种愚蠢的shell方式: tail_file_to_pattern() { pattern=$1 file=$2 tail -n$((1 + $(wc -l $file | cut -d' ' -f1) - $(gr 我试图找到一个简洁的贝壳单线,它会给我所有的
文件中的行直到某个模式.

用例是将所有行转储到日志文件中,直到找到一些为止
表示服务器已重新启动的标记.

这是一种愚蠢的shell方式:

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

在stdin上获取文件的稍微更可靠的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的“保留空间”,但不将其回显到stdout [d].
>当我们遇到模式时,[h]扔掉保持空间并从匹配线重新开始.
>当我们到达文件的末尾时,将保留空间复制到模式空间[g],以便它将回显到stdout.

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

总结

以上是内存溢出为你收集整理的linux – 简洁的方式将所有行打印到与给定模式匹配的最后一行全部内容,希望文章能够帮你解决linux – 简洁的方式将所有行打印到与给定模式匹配的最后一行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1039827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存