Dasselbe wie bei @muru, aber unter Verwendung des Modulo-Operators anstelle von Speichern und Löschen:
tail -fn+1 some/file | awk -v n=30 '
NR > n {print s[NR % n]}
{s[NR % n] = $0}
END{for (i = NR - n + 1; i <= NR; i++) print s[i % n]}'
Eventuell mit awk puffern:
tail -n +0 -f some/file | awk '{b[NR] = $0} NR > 30 {print b[NR-30]; delete b[NR-30]} END {for (i = NR - 29; i <= NR; i++) print b[i]}'
Der awk-Code, erweitert:
{
b[NR] = $0 # save the current line in a buffer array
}
NR > 30 { # once we have more than 30 lines
print b[NR-30]; # print the line from 30 lines ago
delete b[NR-30]; # and delete it
}
END { # once the pipe closes, print the rest
for (i = NR - 29; i <= NR; i++)
print b[i]
}
Das ist nicht sehr effizient, weil es die Datei zwei Sekunden nach dem letzten Lesen erneut liest und Sie Zeilen verpassen, wenn die Ausgabe zu schnell kommt, aber ansonsten erledigt es den Job:
watch 'tail -n40 /path/to/file | head -n10'