Saya memiliki file dengan sekitar 30.000.000 baris (Radius Accounting) dan saya perlu menemukan kecocokan terakhir dari pola yang diberikan.
Perintah:
tac accounting.log | grep $pattern
memberikan apa yang saya butuhkan, tetapi terlalu lambat karena OS harus terlebih dahulu membaca seluruh file dan kemudian mengirim ke pipa.
Jadi, saya butuh sesuatu yang cepat yang dapat membaca file dari baris terakhir ke yang pertama.
sumber
tac
, maksud saya adalah itu tidak membantu kecuali Anda juga menggunakan-m
karena file tersebut masih perlu dibaca secara penuh oleh dua program. Kalau tidak, Anda bisa mencari semua kejadian dan hanya menyimpan yang terakhir seperti yang saya lakukantail -n 1
.grep -m
, itu harus cukup efisien.grep -m
itu. OP tidak menggunakan-m
sehingga grep dan tac memproses semuanya.awk
garis?Alasan mengapa
tidak berhenti pada pertandingan pertama adalah karena buffering.
Biasanya,
head -n 1
keluar setelah membaca satu baris. Jadigrep
harus mendapatkan SIGPIPE dan keluar juga segera setelah ia menulis baris kedua.Tetapi yang terjadi adalah karena outputnya tidak ke terminal,
grep
buffer itu. Yaitu, ini tidak menulisnya sampai cukup terakumulasi (4.096 byte dalam pengujian saya dengan GNU grep).Apa artinya itu adalah bahwa
grep
tidak akan keluar sebelum ia menulis data 8192 byte, jadi mungkin beberapa baris.Dengan GNU
grep
, Anda dapat membuatnya keluar lebih cepat dengan menggunakan--line-buffered
yang memerintahkannya untuk menulis baris segera setelah ditemukan terlepas dari apakah pergi ke terminal atau tidak. Makagrep
akan keluar pada baris kedua yang ditemukannya.Tetapi dengan GNU
grep
, Anda dapat menggunakan-m 1
sebagai gantinya @terdon telah menunjukkan, yang lebih baik karena keluar pada pertandingan pertama.Jika Anda
grep
bukan GNUgrep
, maka Anda bisa menggunakansed
atauawk
sebaliknya. Tetapitac
sebagai perintah GNU, saya ragu Anda akan menemukan sistem dengantac
managrep
bukan GNUgrep
.Beberapa sistem harus
tail -r
melakukan hal yang sama seperti yangtac
dilakukan GNU .Perhatikan bahwa, untuk file biasa (yang dapat dicari),
tac
dantail -r
efisien karena mereka membaca file ke belakang, mereka tidak hanya membaca file sepenuhnya dalam memori sebelum mencetaknya ke belakang (seperti yang dilakukan pendekatan @ slm atautac
pada file non-reguler) .Pada sistem di mana tidak ada
tac
atautail -r
tersedia, satu-satunya pilihan adalah untuk menerapkan membaca mundur dengan tangan dengan bahasa pemrograman sukaperl
atau gunakan:Atau:
Tapi itu berarti menemukan semua kecocokan dan hanya mencetak yang terakhir.
sumber
Berikut ini adalah solusi yang mungkin yang akan menemukan lokasi kemunculan pola pertama dari yang terakhir:
Ini memanfaatkan
-s
dan-r
sakelartac
yang adalah sebagai berikut:sumber
Menggunakan sed
Menampilkan beberapa metode alternatif untuk jawaban baik @ Terdon menggunakan
sed
:Contohnya
Menggunakan Perl
Sebagai bonus, ini sedikit notasi yang lebih mudah diingat di Perl:
Contoh
sumber
sed
) cenderung beberapa kali lipat lebih lambat darigrep 5 | tail -n1
ataused '/5/h;$!d;g'
. Ini juga akan berpotensi menggunakan banyak memori. Ini tidak jauh lebih portabel karena Anda masih menggunakan GNUgrep -m
.