Grep beberapa pola negatif yang cocok


14

Jadi saya punya banyak log Apache dengan menggunakan format log standar. Saya ingin mendapatkan semua baris log yang tidak berasal dari perayap web.

Jadi katakanlah saya punya file robot_patterns dengan entri suka

Googlebot
msnbot-media
YandexBot
bingbot

Jika saya menjalankan perintah grep -f robot_patterns *.logsaya akan mendapatkan semua entri dengan bot yang cocok dengan pola di atas. Daftar aktual saya memiliki ~ 30 entri bot dan agen yang ingin saya abaikan.

Tapi saya ingin menemukan semua entri yang TIDAK dari bot . Jadi saya coba grep -v -f robot_patterns *.logdan tidak ada hasil yang dikembalikan oleh grep. Ini bukan yang saya harapkan atau inginkan, dan saya tidak menemukan cara yang jelas untuk mendapatkan apa yang saya inginkan. Saat menggunakan -vopsi yang dikombinasikan dengan beberapa pola dalam file, grep hanya akan mengembalikan baris yang cocok jika cocok dengan SETIAP pola.


Ketika saya mencoba ini pada sistem saya, grep -v -f memiliki perilaku yang diinginkan, hanya mengembalikan garis yang tidak sesuai dengan pola. Ini dengan (GNU grep) 2.14.56-1e3d. Grep apa yang kamu gunakan?
wingedsubmariner

Saya sedang berlari GNU grep 2.6.3.
Zoredache

4
Saya melakukan beberapa pengujian lagi, dan menemukan bahwa jika ada baris kosong di file pola itu akan cocok dengan setiap baris, menyebabkan tidak ada baris yang dikembalikan dengan -v. Namun ini bukan masalah dengan -F, dan -F mungkin mempercepat grep untuk tugas Anda - mungkin patut dicoba untuk Anda.
wingedsubmariner

Garis kosong yang tertinggal! Argh ... Sepertinya itu masalahnya. Jika mau, Anda harus menambahkan itu sebagai jawaban.
Zoredache

Jawaban:


8

Jika ada baris kosong di file pola itu akan cocok dengan setiap baris, menyebabkan tidak ada garis yang dikembalikan -v. Ini karena garis ditafsirkan sebagai ekspresi reguler, dan ekspresi reguler kosong akan selalu cocok.

Namun ini bukan masalah -Fkarena grepmengabaikan baris kosong -F.
-Fmenyebabkan grepuntuk mengartikan garis sebagai string sederhana untuk dicari dan dapat mempercepat grepjika ekspresi reguler tidak diperlukan.


1
GNU fgrepmengabaikan bahwa membuntuti string kosong adalah bug yang diperbaiki pada 2.19 ( komit 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , jadi Anda tidak harus bergantung padanya
Stéphane Chazelas

13

Anda dapat mencoba:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
Selamat datang di Unix & Linux. OP memiliki daftar sekitar 30 string yang ingin ia abaikan, dan empat yang ia sajikan sebagai contoh masing-masing memiliki panjang rata-rata sepuluh karakter, sehingga perintah Anda kemungkinan panjangnya lebih dari 300 karakter. Ini kemungkinan sulit dipertahankan (dan bahkan dibaca). Bisakah Anda mengubah jawaban Anda didorong oleh daftar string OP? ... ... ... ... ... ... ... ... ... ... "..." ... "..." ... Apakah Anda memperhatikan bahwa jawabannya telah ditemukan? - OP telah belajar cara mendapatkan pendekatan aslinya untuk bekerja.
G-Man Mengatakan 'Reinstate Monica'

2
Mengapa mengevaluasi respons saya secara negatif? : /
Orsius

3
Jawaban yang bagus Memiliki regex OR dan opsi -vE sangat membantu.
Kirt Carson

3
Ini adalah jawaban untuk pertanyaan yang kebanyakan orang mungkin coba selesaikan.
Perfi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.