Saya memiliki file log 8 Gb (log produksi Rails). Saya perlu memotongnya di antara beberapa tanggal (garis). Perintah mana yang bisa saya gunakan untuk melakukan ini?
text-processing
logs
Eric Leschinski
sumber
sumber
sed
akan melakukannya dengan mudah.Jawaban:
Sesuatu seperti
tee cut-log
memungkinkan Anda melihat di layar apa yang dimasukkan ke dalam filecut-log
.EDIT:
Untuk memenuhi standar menuntut fred.bear, inilah solusi sed (meskipun solusi awk bisa dibilang jauh lebih cantik):
sumber
sed
bisa cocokawk
untuk kecepatan, dan itu sebenarnya sedikit lebih cepat.Untuk mencetak semuanya antara FOO dan BAR termasuk, coba:
sumber
Ini akan melakukan apa yang Anda inginkan ...
Termasuk dan tidak termasuk tanggal parameter ditampilkan.
Ini menguji untuk tanggal (diurutkan) di bidang 2 ... Berikut ini adalah contoh untuk data pengujian
Dan di sini adalah generator uji-data .
sumber
awk -v from="$from" -v till="$till" '($2 >= from) { if ($2 <= till) { print } else { exit }' "$file"
if
pernyataan tambahan secara total (bahkan 1 per baris) yaitu. alur logikanya sama, dan perbedaan dalam run time akan dihitung dalam nanodetik .... Satu-satunya alasan saya tidak menggunakan "lain" adalah karena ini secara efektif merupakanawk
skrip pertama saya (selain dari satu hari 4 tahun) lalu ketika saya bermain dengan beberapa contoh) ... dan itu adalah mekanisme cabang yang bisa diterapkan pertama yang saya temukan ... (dan seperti yang disebutkan. Ini sama cepatnya) .. Saya secara umum menggunakansed
Tryq
Jika dalam file log Anda, Anda memiliki tanggal dalam format ini
YYYY-MM-DD
, maka, untuk menemukan semua entri misalnya, 2011-02-10, Anda dapat melakukan:Sekarang, katakanlah, jika Anda ingin menemukan entri untuk 2011-02-10 dan 2011-02-11, maka, sekali lagi gunakan
grep
tetapi dengan beberapa pola:sumber
grep
akan mencari seluruh file, bahkan jika rentang tanggal di awal file. Rata-rata ini menggandakan waktu pencarian, bila dibandingkan dengan "keluar-setelah-item-terakhir-dalam-jangkauan" ... Saya hanya repot menyebutkan ini karena ukuran file 8 GB yang disebutkan dalam pertanyaan, Anda hasil grep waktu hampir identik dengan contoh sed di sini (1 menit 58detik). Inilah tautan ke hasil tes waktu saya: paste.ubuntu.com/573477Bekerja dengan ukuran file ini selalu sulit.
Cara ke depan bisa dengan membagi file ini menjadi beberapa yang kecil, untuk melakukan ini Anda dapat menggunakan perintah split.
Meskipun Anda sudah berpisah Anda masih dapat bekerja dengan file seperti jika akan menggunakan bash untuk loop
Tapi alih-alih kucing Anda dapat menggunakan grep terbalik untuk menyingkirkan data yang tidak diinginkan, itu tidak relevan untuk ini. (atau jenis penyempurnaan yang Anda butuhkan).
Pada titik ini Anda hanya akan bekerja dengan banyak file yang lebih kecil, dan perintah yang disebutkan di atas akan bekerja lebih baik pada banyak file yang lebih kecil.
Dan setelah selesai, Anda dapat menggunakan perulangan kedua untuk membuat kembali file yang lebih kecil.
Pembaruan Karena kami mulai membagi data menjadi beberapa file, akan ada banyak pekerjaan dengan harddisk dan itu membutuhkan waktu. (Dalam pertanyaan ini rupanya 5 menit).
Di sisi lain langkah selanjutnya mungkin akan lebih cepat.
Jadi metode ini mungkin tidak ada gunanya untuk operasi sederhana grep, awk, sed, tetapi jika pola pencarian menjadi lebih rumit itu bisa menjadi lebih cepat.
sumber
sumber