Обрізати декілька негативних збігів за малюнком


14

Тож у мене є маса журналів Apache із використанням стандартного формату журналу. Я хочу отримати всі рядки журналу, які не надходили від веб-сканера.

Тож скажемо, що у мене є файл robot_patterns з такими записами

Googlebot
msnbot-media
YandexBot
bingbot

Якщо я запускаю команду, grep -f robot_patterns *.logя отримаю всі записи ботами, які відповідають вищевказаним шаблонам. Мій фактичний список містить ~ 30 записів ботів та агентів, які я хочу проігнорувати.

Але я хочу знайти всі записи, які НЕ від ботів . Тому я намагаюся, grep -v -f robot_patterns *.logі результати не повертаються grep. Це не те, чого я очікую чи бажаю, і я не знаходжу очевидного способу отримати те, що хочу. При використанні -vопції, поєднаної з декількома візерунками у файлі, grep поверне відповідний рядок лише у випадку, коли він відповідає ВСЕ.


Коли я спробував це у своїй системі, grep -v -f мав бажану поведінку, лише повертаючи рядки, які не відповідали жодному з шаблонів. Це було з (GNU grep) 2.14.56-1e3d. Який греп ви використовуєте?
крила підводного човна

Я бігаю GNU grep 2.6.3.
Зоредаче

4
Я зробив ще кілька тестувань, і виявив, що якщо у файлі шаблонів є порожній рядок, він буде відповідати кожному рядку, в результаті чого рядки не повертаються з -v. Це не проблема з -F, однак, і -F може прискорити хід для вашої задачі - можливо, варто спробувати для вас.
крила підводного човна

Порожній порожній рядок! Арг ... Це, здається, саме в цьому питання. Якщо ви хочете, додайте це як відповідь.
Зоредаче

Відповіді:


8

Якщо у файлі шаблонів є порожній рядок, він відповідатиме кожному рядку, не спричиняючи повернення рядків -v. Це тому, що рядки інтерпретуються як регулярні вирази, і порожній регулярний вираз завжди буде відповідати.

Однак це не проблема -F, оскільки grepігнорує порожні рядки -F.
-Fвикликає grepінтерпретацію рядків як прості рядки для пошуку та може пришвидшити, grepякщо регулярні вирази не потрібні.


1
GNU fgrepігноруючи, що остання порожня рядок була помилкою, яку було виправлено у 2.19 ( фіксувати 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , тому не варто на неї покладатися.
Stéphane Chazelas

13

Ви можете спробувати:

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

2
Ласкаво просимо до Unix & Linux. У OP є список приблизно з 30 рядків, які він хоче ігнорувати, а чотири, які він подав у якості прикладів, мають середню довжину по десять символів кожен, тому ваша команда, ймовірно, має більше 300 символів. Це, ймовірно, буде важко підтримувати (і навіть читати). Чи можете ви змінити свою відповідь так, щоб керуватися списком рядків ОП? ……………………………………………………… PS Ви помітили, що відповідь знайдена? - ОП навчилася отримувати свій оригінальний підхід до роботи.
G-Man каже: "Відновіть Моніку"

2
Чому негативно оцінюють мою відповідь? : /
Орсій

3
Чудова відповідь. Має регулярне вираження АБО і варіант -vE був корисним.
Кірт Карсон

3
Це відповідь на питання, яке, мабуть, намагається вирішити більшість людей.
Перфі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.