Итак, у меня есть куча журналов Apache с использованием стандартного формата журналов. Я хочу получить все строки журнала, которые не пришли из веб-сканера.
Допустим, у меня есть файл robot_patterns с записями вроде
Googlebot
msnbot-media
YandexBot
bingbot
Если я выполню команду, grep -f robot_patterns *.log
я получу все записи ботами, соответствующими указанным выше шаблонам. Мой фактический список содержит ~ 30 записей ботов и агентов, которые я хочу игнорировать.
Но я хочу найти все записи, которые НЕ от ботов . Поэтому я стараюсь, grep -v -f robot_patterns *.log
и результаты не возвращаются grep. Это не то, чего я ожидаю или желаю, и я не нахожу очевидного способа получить то, что я хочу. При использовании -v
опции, объединенной с несколькими шаблонами в файле, grep будет возвращать совпадающую строку, только если она соответствует КАЖДОМУ шаблону.
GNU grep 2.6.3
.Ответы:
Если в файле шаблонов есть пустая строка, она будет соответствовать каждой строке, в результате чего строки не будут возвращены
-v
. Это потому, что строки интерпретируются как регулярные выражения, и пустое регулярное выражение всегда будет совпадать.Это не проблема,
-F
однако,grep
игнорирует пустые строки с-F
.-F
заставляетgrep
интерпретировать строки как простые строки для поиска и может ускоряться,grep
если регулярные выражения не нужны.источник
fgrep
игнорирование этой завершающей пустой строки было ошибкой, исправленной в 2.19 ( commit 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , поэтому на нее не следует полагаться.Можешь попробовать:
источник