Grep di file log besar (> 14 GB) hanya x GB terakhir?

34

Saya perlu mencari sesuatu di file log besar (lebih dari 14 GB). Saya cukup yakin itu dalam 4 GB terakhir atau lebih.

Apakah ada cara untuk melewatkan X GB pertama untuk mempercepatnya?

Roger
sumber
7
LC_ALL=C grepdapat mempercepatnya.
jfs
1
Anda akan bisa mendapatkan banyak kecepatan dengan memilih grepekspresi yang masuk akal ... wildcard dengan panjang yang tidak diketahui (seperti a.*thing) dalam beberapa kasus akan membutuhkan waktu lebih lama untuk dievaluasi. Mungkin Anda mengoptimalkan hal yang salah (walaupun tidak ada salahnya mencari hanya bagian file, tentu saja - itu mungkin bukan sumber percepatan terbesar).
Floris

Jawaban:

75

Saya kira Anda bisa menggunakan tail hanya output yang 4GB terakhir atau lebih dengan menggunakan -cswitch

-c, --bytes = [+] NUM
menampilkan NUM byte terakhir; atau gunakan -c + NUM untuk keluaran dimulai dengan byte NUM dari setiap file

Anda mungkin bisa melakukan sesuatu dengan dd juga dengan mengatur bs=1dan skipmemasukkan ke offset yang ingin Anda mulai misalnya

dd if=file bs=1024k skip=12g | grep something
user9517 mendukung GoFundMonica
sumber
83
Setelah itu, Anda harus mengkonfigurasi logrotate.
Gerald Schneider
3
@Ogier Silakan tambahkan jawaban dengan solusi alih-alih menambahkannya dalam pertanyaan Anda. Ini mirip dengan jawaban sendiri: serverfault.com/help/self-answer
AL
5
@istheEnglishway: Ya, tidak, mereka memposting perintah yang berbeda.
Lightness Races dengan Monica
11
Tetapi jawaban Anda tidak memberikan perintah aktual yang mengimplementasikan solusi itu, yang merupakan nilai tambah. Anda dapat mengeditnya dalam jawaban Anda, atau OP dapat mempostingnya sebagai jawaban baru. Mereka pasti tidak seharusnya menambahkannya ke pertanyaan, itulah yang terjadi. Dan Anda pastinya tidak harus melemparkan julukan seperti "menyodok hidung Anda".
Lightness Races dengan Monica
7
@istheEnglishway, percaya atau tidak memiliki contoh membuat segalanya lebih mudah daripada harus membaca halaman manual (lihat juga: dokumentasi stackoverflow)
Pierre.Sassoulas
32

Saya hanya memposting ini karena beberapa komentar memintanya.

Apa yang akhirnya saya gunakan adalah (file 15 GB). Ini bekerja sangat cepat dan menghemat banyak waktu.

tail -f -c 14G file | grep something

Saya juga melakukan benchmark yang sangat dasar pada file yang sama. Saya menguji:

grep xxx file
// butuh selama-lamanya (> 5 menit)

dd if = file bs = 1 lewati = 14G | grep xxx
// sangat cepat <1 detik

tail -c 14g | grep xxx
// cukup cepat <2 detik

yang tailhanya sedikit lebih pendek.

NB: akhiran yang digunakan gdan Gberbeda per perintah (Ubuntu 15.10)

Roger
sumber
Apakah Anda menghapus cache disk di antara tolok ukur? Saya menduga sebagian besar waktu di yang pertama adalah I / O. Speedup harus dalam urutan 15 ×, bukan 300 ×.
Reid
2
@ Reid saya tidak. Tetapi saya menjalankan setiap perintah beberapa kali. Saya cukup yakin bahwa dd atau tail akan meningkatkan kecepatan secara signifikan hanya dengan grep (cache atau tidak).
Roger
19

Ini tidak menjawab pertanyaan Judul, tetapi itu akan melakukan apa yang ingin Anda lakukan. Gunakan tac untuk membalikkan file, lalu gunakan grep untuk menemukan string Anda. Jika string Anda hanya muncul sekali atau beberapa kali dalam file, maka biarkan berjalan sampai menemukan jumlah kemunculan yang diketahui. Dengan begitu, jika asumsi Anda tentang di mana file itu salah, ia akan tetap menemukannya. Jika Anda ingin membatasi, Anda dapat menggunakan head untuk melakukannya. Perintah head akan menuju antara tac dan grep.

Jadi perintahnya terlihat seperti:

tac < logfile | grep myString
Itsme2003
sumber
1
Saya datang ke sini untuk menulis jawaban yang sama persis. Saya terkejut tidak ada yang memilih Anda.
Dmitry Grigoryev
2
Butuh waktu sebentar, tapi kemudian aku mengerang karena permainan kata ... tac adalah kebalikan dari kucing.
Sammi
1
Saya perlu menggali log aplikasi / debug . Karena membalikkan garis, itu tidak semakin mudah dibaca ;-) Namun, tampaknya sangat cepat. Tidak pernah melihat tac, terima kasih!
Roger