當將 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 參數來遞歸它們,或者您可以只放置目錄/*)。如果未指定,它將嘗試像您一樣讀取標準輸入。

   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 -v ICMP >/home/user/staging (第二個 ssh 會話) grep -e ALLOW -e BLOCK 有點不傳統,但它有效。

相關內容