Я хочу исключить определенные слова из результатов при передаче tail в grep

Я хочу исключить определенные слова из результатов при передаче tail в grep

Я использую "tail -f /var/log/fail2ban.log -f /var/log/ufw.log | grep -e Ban -e BLOCK -e ALLOW" (без кавычек), и это работает, но я хочу исключить результаты, в которых есть слова UDP и ICMP. Когда я пробую "tail -f /var/log/fail2ban.log -f /var/log/ufw.log | grep -e Ban -e BLOCK -e ALLOW -v UDP -v ICMP", я получаю ошибку "grep: UDP: Нет такого файла или каталога". Похоже, что использование -v для исключения слов не работает при конвейеризации.

введите описание изображения здесь

решение1

Вы можете просто передать первый вывод другому grep и использовать его как еще один «фильтр», например:

tail -f /var/log/fail2ban.log -f /var/log/ufw.log | grep "Ban\|BLOCK\|ALLOW" | grep -v "UDP\|ICMP"

Обратите внимание, что grep может объединять разные строки, даже регулярные выражения, если вы используете двойные кавычки, разделяя их вертикальной чертой "|", но вам следует экранировать символ с помощью "\", чтобы не получить странных вещей.

Параметр -v буквально говорит в man

-v, --invert-match Изменить смысл сопоставления на противоположный, чтобы выбрать несовпадающие строки.

Таким образом, похоже, что он просто инвертирует определенное вами соответствие, поэтому вы не можете его параметризовать.

Как вы видите в синопсисе, вы можете указать 3 типа параметров: параметры, шаблон и файл.

Варианты всегда начинаются с - или -- и вы можете разместить их множество.

Вы можете определить отдельный шаблон или определенный тип шаблона с помощью -e или -f или без каких-либо параметров.

И всегда последним должен быть файл/ы или каталог (для рекурсии каталогам необходим параметр -R, или вы можете просто указать directory/*). Если не указано иное, будет предпринята попытка прочитать stdin, как вы это делаете.

   SYNOPSIS
   grep [OPTION...] PATTERNS [FILE...]
   grep [OPTION...] -e PATTERNS ... [FILE...]
   grep [OPTION...] -f PATTERN_FILE ... [FILE...]

В любом случае это ужеответилболее простым способом

решение2

У меня есть обходной путь с использованием двух сеансов SSH: я перевожу результаты первого оператора grep в файл, а затем во втором сеансе SSH перевожу результаты в grep. (первый сеанс SSH) - tail -f /var/log/fail2ban.log -f /var/log/ufw.log | grep -v ICMP >/home/user/staging (второй сеанс SSH) - tail -f /home/user/staging | grep -e ALLOW -e BLOCK немного нетрадиционно, но работает.

Связанный контент