我正在使用“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 参数来递归它们,或者您可以只输入目录/*)。如果没有指定,它将尝试像您正在做的那样读取标准输入。
SYNOPSIS
grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]
无论如何这已经已回答更基本的方式
答案2
我有一个解决方法,使用 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 有点不合常规,但它有效。