Saya menggunakan egrep ( grep -E
) dengan file POLA. ( -f path/to/file
).
Ini dilakukan dalam loop tak terbatas pada aliran teks. Ini menyiratkan bahwa saya tidak dapat mengakumulasi dan meneruskan SEMUA input untuk menerima sekaligus (seperti *.log
).
Apakah ada cara untuk membuat grep "save" NFA yang sedang dibangun dari file POLA untuk digunakan untuk menjalankan selanjutnya?
Saya telah mencari Google dan membaca dokumentasi tanpa hasil.
Saya akan mencoba menjelaskannya sedikit lagi. Saya perlu mencari sejumlah string yang tetap dengan regex (Ini bukan bagian dari pertanyaan, tetapi jangan ragu untuk menyarankan sebaliknya) seperti alamat IP, domain, dll. Pencarian dilakukan berdasarkan umpan dari internet. Anda dapat menganggapnya sebagai aliran teks. Saya tidak dapat menggunakan grep
semua input karena ini adalah stream. Saya dapat mengakumulasi sepotong aliran dan menggunakannya grep
(jadi tidak menggunakan grep
pada setiap baris) tetapi ini juga terbatas (katakanlah selama 30 detik).
Saya tahu grep
sedang membangun NFA dari semua polanya (dalam kasus saya dari file). Jadi pertanyaan saya di sini adalah: dapatkah saya katakan grep
untuk menyimpan NFA untuk menjalankan selanjutnya, karena itu tidak akan berubah? Itu akan menyelamatkan saya waktu membangun NFA itu setiap waktu.
grep
teks per baris? Dari mana teks itu berasal? Apakahtail -f
akan menjadi pilihan?grep
potongan itu.grep
beberapa kali. Kemungkinan terkait: Mengapa mencocokkan 1250 string dengan pola 90k sangat lambat?grep
dimaksudkan untuk bekerja pada aliran teks, saya masih belum mengerti mengapa Anda perlu menjalankan beberapa instance. Mengapa Anda tidak bisa memberi makan semua orang kegrep
contoh yang sama ? Mengapa Anda harus menumpuknya sebelum disusuigrep
?Jawaban:
Tidak, tidak ada yang seperti itu. Umumnya biaya untuk memulai
grep
(melakukan proses baru, memuat library yang dapat dieksekusi, shared, linkage dinamis ...) akan jauh lebih besar daripada mengkompilasi regexps, jadi optimasi semacam ini tidak masuk akal.Meskipun melihat Mengapa mencocokkan 1250 string dengan pola 90k sangat lambat? tentang bug di beberapa versi GNU
grep
yang akan membuatnya sangat lambat untuk sejumlah besar regexps.Mungkin di sini, Anda dapat menghindari menjalankan
grep
beberapa kali dengan memberi makan potongan Anda kegrep
contoh yang sama , misalnya dengan menggunakannya sebagai proses bersama dan menggunakan penanda untuk mendeteksi akhirnya. Denganzsh
dan GNUgrep
danawk
implementasi selainmawk
:Meskipun mungkin lebih mudah untuk melakukan semuanya dengan
awk
atauperl
sebagai gantinya.Tetapi jika Anda tidak membutuhkan
grep
output untuk masuk ke file yang berbeda untuk potongan yang berbeda, Anda selalu dapat melakukannya:sumber
grep
adanya. Terima kasih.Apakah Anda sadar bahwa saluran pipa itu memblokir? Jika Anda mengirim sesuatu ke grep dan semua input tidak tersedia, grep akan menunggu sampai tersedia dan kemudian melanjutkan seolah-olah input ada di sana selama ini.
EDIT: Bagaimana jaringan pipa bekerja, misalnya dengan
cmd1 | cmd2
adalah bahwa kedua program akan mulai pada saat yang sama, dengan misalnya 65,536-byte "chunk buffer" di antara mereka. Ketikacmd2
mencoba membaca dan buffer itu kosong, buffer akan menunggu tersedia. Ketikacmd1
mencoba menulis dan buffer itu penuh, ia akan menunggu sampaicmd2
membacanya.Dari apa yang bisa saya baca, tidak perlu memotong input menjadi potongan-potongan dan meneruskannya ke grep secara terpisah. Itu sudah dilakukan secara otomatis.
EDIT2:
grep
juga harus mencetak hasilnya segera setelah ditemukan di aliran Tidak perlu streaming selesai sebelum Anda bisa mendapatkan hasil.sumber
Mungkin Anda bisa "menggunakan grep pada semua input"? Menggunakan
nc
(netcat), atau melaluiscript
, atau melalui alat lain yang serupa? Terutama jika patternfile Anda memiliki ukuran yang dapat dikelola (katakanlah kurang dari 1000 regexps).Contoh pertama : Anda dapat
egrep
beberapa koneksi streaming: (contoh di sini ditunjukkan dengannc
, tetapi yang lain bisa berlaku)(catatan: Anda bahkan dapat:
touch /some/path/results.gz
sebelum memulainc
perintah, dan memilikitail -f
file (kosong) itu untuk tidak melewatkan apa pun. Bagaimanapun, results.gz akan berisi semua yang ingin Anda tangkap)contoh kedua : Anda bahkan bisa
egrep
pada sesi shell yang sedang berjalan (dan menunjukkan cara lain untuk mengikuti perkembangan):egrep
adalah versi yang sangat efisiengrep
untuk sebagian besar sistem (lihat beberapa info interresting di: https://swtch.com/~rsc/regexp/regexp1.html )sumber
s
jauh, bubur lebih lambat dari pencocokansomething
dan ini jauh lebih lambat daripada pencocokansomething even much longer
(yang terakhir memungkinkan pencocokan regexp untuk melompati lebih besar) bagian dari input ketika berbeda) Pada file besar, pada dasarnya "membagi" waktu untuk menguraikannya dengan rasio panjang (yaitu, menangkap 1 karakter yang dikenal hampir 40 kali lebih lambat daripada mencocokkan string 40 karakter yang dikenal. Saya tidak t prof it tetapi benar-benar terlihat.)