Sama seperti @muru tetapi menggunakan operator modulo alih-alih menyimpan dan menghapus:
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]}'
Mungkin penyangga dengan awk:
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]}'
Kode awk, diperluas:
{
    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]
}
Ini sangat tidak efisien, karena ini akan membaca ulang file dua detik setelah membacanya terakhir kali, dan Anda akan kehilangan baris jika hasilnya terlalu cepat, tetapi sebaliknya akan melakukan pekerjaan:
watch 'tail -n40 /path/to/file | head -n10'
            Mengapa output dari openssl passwd berbeda setiap kali?         
            Cara menekan semua peringatan yang diperlakukan sebagai kesalahan untuk pemotongan format