我正在尝试找到一个简洁的Shell单行命令,可以给我所有文件中的行,直到某个模式为止。
使用情况是将日志文件中的所有行转储,直到我发现一些标记,表示服务器已重新启动。
这里有一个愚蠢的仅使用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
}
以下是一个稍微可靠一些的Perl方法,可以从stdin读取文件:
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'
但是我还没有想到一种方法,可以按照最后一次出现的方式打印所有内容。