Saya ingin mencari tanggal yang berada di suatu tempat dalam log 8 GB (teks).
Dapatkah saya agak bypass sequential read penuh, dan pertama kali melakukan split biner dari file (ukuran), atau entah bagaimana menavigasi filesystem inodes
(yang saya tahu sangat sedikit tentang), untuk mulai membaca dari setiap titik split, sampai aku menemukan yang cocok offset dari di mana harus memulai pencarian teks saya untuk baris yang memuat tanggal?
tail
Bacaan baris terakhir tidak menggunakan pembacaan berurutan normal, jadi saya ingin tahu apakah fasilitas ini entah bagaimana tersedia di bash, atau apakah saya perlu menggunakan Python atau C / C ++ ... tapi saya secara khusus tertarik pada bash
opsi ..
bash
filesystems
text-processing
Peter.O
sumber
sumber
Jawaban:
yang .. tidak membuat file temp-split, melompati blok * 512MB data pada setiap kali dijalankan, membaca 64 byte dari posisi itu dan membatasi output ke baris pertama dari 64 byte itu.
Anda mungkin ingin menyesuaikan 64 dengan apa pun yang Anda pikir Anda butuhkan.
sumber
dd
untuk itu juga ... Ini adalah alat yang hebat! :)Kedengarannya seperti yang Anda inginkan:
atau berapa pun byte yang ingin Anda lewati. Tanda plus memberi tahu ekor untuk mengukur dari awal file bukan akhir. Jika Anda menggunakan ekor versi GNU Anda dapat menuliskannya sebagai:
Untuk mendapatkan jumlah byte yang tetap setelah dipotong, alih-alih semua sisa file, cukup pipa melalui kepala:
sumber
dd
melompat ke byte tertentu (seperti halnyatail
), tetapi itu adalah kode sakit di sekitar panjang garis yang tidak diketahui, dan kemudian panggilan untuk sed untuk melepaskan garis parsial terkemuka ... Sepertinya ekor | kepala dapat melakukan itu tanpa rasa sakit (secepat?) . Saya tidak mengerti bagaimana kepala dapat mematikan keran di ekor, tetapi tampaknya :) Ini harus menjadi kasus: Jika kepala berhenti menerima, ekor berhenti mengirim (dan berhenti membaca lebih lanjut). Harus pergi .. kembali besok.tail
Sayahead
tidak bisa membutakan tebak panjang garis juga. Anda harus melompat ke posisi x dan kemudian Anda dapat melihat ke kiri atau kanan x untuk selanjutnya\n
. tidak masalah apa nama programnya. jadi, dalam kedua kasus Anda melompat ke x dan kemudian gunakanhead
untuk melihat ke kanan untuk akhir baris berikutnya.tail|head
menawarkan kemampuan untuk tidak peduli sama sekali tentangdd
's count = val. Dengan 'dd', jika saya tidak mengambil data yang cukup, itu "game over". Fleksibilitas panjang garis arbiter bagus. Saya telah menulis fungsi untuk 'dd' yang mengembalikan baris penuh "terdekat berikutnya" dan ofsetnya, tapi saya lebih suka menghindari masalah panjang. Saya sekarang telah menguji tail | head, dan awalnya berkinerja baik (untuk mengimbangi = 100MB), tetapi melambat secara dramatis untuk mengambil 2 menit untuk satu akses pada offset = 8GB (saya bisaawk
dalam 1 menit) ... jadi itu bagus untuk file yang lebih kecil .. Terima kasih telah membuat saya mengetahui tentang combo ekor / kepala :)Saya akan mencoba sesuatu seperti ini untuk memecah log menjadi potongan 512MiB untuk penguraian yang lebih cepat.
Jika Anda mencari file, yang berikut ini akan berfungsi:
Gunakan output itu untuk menentukan file mana yang akan diambil untuk kencan Anda.
sumber
Ini adalah skrip saya, saya mencari baris pertama sedang kolom pertama cocok dengan nomor saya. Garis diurutkan sesuai dengan bidang pertama. Saya menggunakan dd untuk memeriksa baris pertama blok 128K, lalu saya melompat ke blok dan melakukan pencarian. Ini meningkatkan efisiensi adalah file lebih dari 1M.
Setiap komentar atau koreksi sangat dihargai!
* EDIT * ** grep jauh lebih cepat dan ack lebih baik
sumber