linux – 简洁的方式将所有行打印到与给定模式匹配的最后一行
发布时间:2020-12-13 16:58:29 所属栏目:Linux 来源:网络整理
导读:我试图找到一个简洁的贝壳单线,它会给我所有的 文件中的行直到某个模式. 用例是将所有行转储到日志文件中,直到找到一些为止 表示服务器已重新启动的标记. 这是一种愚蠢的shell方式: tail_file_to_pattern() { pattern=$1 file=$2 tail -n$((1 + $(wc -l $fi
我试图找到一个简洁的贝壳单线,它会给我所有的
文件中的行直到某个模式. 用例是将所有行转储到日志文件中,直到找到一些为止 这是一种愚蠢的shell方式: 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 } 在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]. 另请注意,对于非常大的文件,它可能会变慢,因为任何单通道解决方案都需要在内存中保留一堆行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |