Grep çoklu model negatif eşleşmesi


14

Bu yüzden standart günlük biçimini kullanarak bir grup Apache günlüküm var. Bir web tarayıcısından gelmeyen tüm günlük satırlarını almak istiyorum.

Diyelim ki robot_patterns gibi girişlere sahip bir dosyam var

Googlebot
msnbot-media
YandexBot
bingbot

Komutu çalıştırırsam grep -f robot_patterns *.log, yukarıdaki kalıplarla eşleşen botlarla tüm girişleri alırım. Asıl listemde, yoksaymak istediğim ~ 30 bot ve aracı girişi var.

Ama botlardan OLMAYAN tüm girişleri bulmak istiyorum . Bu yüzden deniyorum grep -v -f robot_patterns *.logve hiçbir sonuç grep tarafından döndürülmez. Beklediğim ya da arzu ettiğim bu değil ve istediğimi elde etmek için açık bir yol bulamıyorum. -vSeçeneği bir dosyada birden çok desenle birlikte kullanırken , grep yalnızca HER kalıpla eşleşiyorsa eşleşen bir satır döndürür.


Bunu sistemimde denediğimde, grep -v -f istenen davranışa sahipti, sadece desenlerin hiçbiriyle eşleşmeyen çizgiler döndürdü. Bu (GNU grep) 2.14.56-1e3d idi. Hangi grep'i kullanıyorsun?
wingedsubmariner

Ben koşuyorum GNU grep 2.6.3.
Zoredache

4
Biraz daha test yaptım ve kalıplar dosyasında boş bir satır varsa, her satırla eşleşeceğini ve hiçbir satırın -v ile döndürülmeyeceğini buldum. Ancak -F ile ilgili bir sorun değil ve -F göreviniz için grep'i hızlandırabilir - sizin için denemeye değer olabilir.
wingedsubmariner

Sonunda boş bir çizgi! Argh ... Sorun böyle görünüyor. İsterseniz cevap olarak eklemelisiniz.
Zoredache

Yanıtlar:


8

Desenler dosyasında boş bir satır varsa, her satırla eşleşir ve hiçbir satırın döndürülmemesine neden olur -v. Bunun nedeni, satırların normal ifadeler olarak yorumlanması ve boş bir normal ifadenin her zaman eşleşmesidir.

-FBununla birlikte bu sorun değil , çünkü grepboş satırları yok sayar -F. satırların aranacak basit dizeler olarak yorumlanmasına
-Fneden olur grepve grepdüzenli ifadeler gerekmiyorsa hızlanabilir.


1
GNU fgrep, boş dizenin sondaki 2.19'da düzeltildiğini görmezden geldi ( 2d3832e1ff772dc1a374bfad5dcc1338350cc48b) , bu yüzden ona güvenmemelisiniz.
Stéphane Chazelas

13

Deneyebilirsin:

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

2
Unix ve Linux'a hoş geldiniz. OP'nin göz ardı etmek istediği yaklaşık 30 dizenin bir listesi vardır ve örnek olarak sunduğu dördünün her biri ortalama on karakter uzunluğundadır, bu nedenle komutunuzun 300 karakterden uzun olması muhtemeldir. Bunu sürdürmek (hatta okumak) zor olabilir. Yanıtınızı OP'nin dize listesi tarafından yönlendirilecek şekilde değiştirebilir misiniz? ………………………………………………………… PS Cevabın bulunduğunu fark ettiniz mi? - OP, orijinal yaklaşımını işe nasıl getireceğini öğrendi.
G-Man, 'Monica'yı Yeniden Başlat' diyor

2
Yanıtımı neden olumsuz olarak değerlendirmeliyim? : /
Orsius

3
Mükemmel cevap. Normal ifade VEYA -vE seçeneği yardımcı oldu.
Kirt Carson

3
Bu, çoğu insanın muhtemelen çözmeye çalıştığı sorunun cevabıdır.
Perfi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.