Вы также можете использовать grep -F -v -e <phrase1> -e <phrase2> ... -e <phraseN>
, как показано ниже:
cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | grep -F -v -e "Googlebot" -e "bingbot" -e "Applebot" | sort -n | uniq -c | sort -nr | head -30
-F
указывает grep обрабатывать строки поиска как фиксированную строку ... обычно это много быстрее, чем использование регулярных выражений
-e
позволяет указать выражение.Использование нескольких -e
флагов позволяет объединять несколько выражений для использования в одной команде grep.
В качестве альтернативы, вы можете использовать файл «черного списка» и делать что-то вроде следующего:
cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | grep -F -f blacklist.txt -v | sort -n | uniq -c | sort -nr | head -30
где содержимое blacklist.txt:
Applebot
Googlebot
bingbot
... преимущество в том, что когда вы найдете новую запись, которую хотите игнорировать, вы можете просто добавить ее в черный список вместомодифицируя ваш скрипт ... он также вполне читабелен.
edit : Вы также можете переместить аргумент -r
на свой первый sort
и вообще избежать второго вызова.Кроме того, поскольку вы используете awk
, вы можете полностью избавиться от grep (учтите, что за счет использования регулярных выражений, но поскольку уже обрабатывает каждую строку в файле, вы можете сохранить большевремя на ввод / вывод):
cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '!/Applebot|Googlebot|bingbot/{print $5 $11}' | sort -nr | uniq -c | head -30
Я бы также предложил избавиться от ведущего кота, потому что awk
откроет файл для чтения без изменений (если вы не скажете ему изменить файл):
awk -F'|' '!/Applebot|Googlebot|bingbot/{print $5 $11}' /var/log/apache2/proxy.example.com.access.log | sort -nr | uniq -c | head -30
и, поскольку вы знаете расположение полей, вы также можете использовать sed
, что будет быстрее, чем awk
... Я оставляю это в качестве упражнения для читателя (простоимейте в виду, что индексированные результаты поиска: ls | sed -n 's/\(.*\)\.txt/\1/p'
приводит к тому, что все файлы '* .txt' распечатываются без их расширения)