Sto cercando di trovare un one-liner di shell succinta che mi dia tutte le righe in un file fino al un po 'di pattern.Modo succinto di stampare tutte le linee fino all'ultima riga che corrisponde a un dato motivo
Il caso d'uso sta scaricando tutte le righe in un file di registro finché non vedo qualche indicatore che indica che il server è stato riavviato.
Ecco un stupido guscio unico modo che:
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
}
Un modo un po 'più affidabile Perl che prende il file 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];
}
'
E, naturalmente, si potrebbe fare che essere più efficiente aprendo il file, cercando fino alla fine e cercando fino a quando non hai trovato una linea corrispondente.
E 'facile da stampare tutto come della prima occorrenza, ad es .:
sed -n '/PATTERN/,$p'
Ma non hanno escogitato un modo per stampare tutto come del ultima avvenimento.
Il titolo dice "tutte le linee fino al l'ultimo modello "ma i tuoi due script di esempio stampano tutte le linee dall'ultimo modello alla fine. Presumo che sia il titolo a essere fuorviante? –
Se il pattern sarà di solito presente e vicino alla fine, potresti prendere in considerazione [File :: ReadBackwards] (http://search.cpan.org/perldoc?File::ReadBackwards) (passando in un buffer fino a raggiungere il modello o l'inizio del file). – ikegami