Cara tail / grep / awk N byte terakhir file, bukan baris

13

Saya memiliki aplikasi yang masuk ke file log teks biasa (myapp.log) tetapi tampaknya tidak menulis karakter baris baru di akhir setiap entri log. Jika saya menjalankan perintah seperti tail -n 50 myapp.logsaya benar-benar menerima ratusan "baris" teks (entri log).

File log ini sangat besar, kira-kira 1GB, yang tahu berapa lama CR terakhir dan / atau LF adalah inserterd. Bagaimana saya bisa ambil katakan, 2MB terakhir misalnya?

jwbensley
sumber

Jawaban:

26

Menggunakan -csakelar (2MB = 2 * 1024 * 1024 = 2097152 byte):

tail -c 2097152 myapp.log

Terima kasih kepada Petr Uzel untuk sarannya. Beberapa implementasi ekor memungkinkan untuk menambahkan unit untuk mencetak kilobyte terakhir (k) atau megabita (m), seperti:

tail -c 2m myapp.log

Namun harap dicatat bahwa ini bukan standar (tidak ada dalam POSIX, UNIX (SUS) atau Linux (LSB)) dan tidak portabel. Juga perhatikan bahwa karena istilah "Mega" / "kilo" ... dan singkatannya (M, k ...) memiliki makna yang ambigu (1000 vs 1024), tidak ada banyak jaminan tentang apa yang dimaksud dengan implementasi ini atau implementasi tailakan berarti oleh 2m(meskipun versi saat ini dari implementasi saat ini yang mendukungnya tampaknya akan berjalan untuk varian 1024).

Birei
sumber
5
Ekor harus dapat menerima angka dengan satuan sebagai argumen untuk sakelar c, jadi tail -c 2M myapp.logharus juga berfungsi.
Petr Uzel
@PetrUzel: Terima kasih. Edit jawaban untuk menambahkannya.
Birei
Sekarang saya merasa konyol :) Terima kasih atas ketepatannya, sangat menghargai itu. Saran bagus!
jwbensley
1
Sempurna, Tidak yakin apakah ini akan membantu tetapi saya akan menambahkan teks-string ini karena itu adalah kata kunci yang saya cari untuk sampai di sini (butuh beberapa saat): "cat file data antara dua posisi byte (bukan baris) "
Torxed