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
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)
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.
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!
LC_ALL=C grep
dapat mempercepatnya.grep
ekspresi yang masuk akal ... wildcard dengan panjang yang tidak diketahui (sepertia.*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).Jawaban:
Saya kira Anda bisa menggunakan tail hanya output yang 4GB terakhir atau lebih dengan menggunakan
-c
switchAnda mungkin bisa melakukan sesuatu dengan dd juga dengan mengatur
bs=1
danskip
memasukkan ke offset yang ingin Anda mulai misalnyasumber
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.
Saya juga melakukan benchmark yang sangat dasar pada file yang sama. Saya menguji:
yang
tail
hanya sedikit lebih pendek.NB: akhiran yang digunakan
g
danG
berbeda per perintah (Ubuntu 15.10)sumber
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:
sumber
tac
, terima kasih!