Я использую "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 немного нетрадиционно, но работает.