Bash

grep -v 過濾器不起作用

  • May 7, 2020

我想grep使用grep -v選項過濾結果。但是在使用特定模式時,輸出並沒有什麼不同。log.log 的內容:

ERROR
error
EXCEPTION
exception
<STATUS>ERROR</STATUS>
<MessageType>ERROR</MessageType>

當我執行命令時:

egrep -wi 'error|exception' /temp/log.log | grep -v 'error'

給出輸出:

ERROR
EXCEPTION
exception
<STATUS>ERROR</STATUS>
<MessageType>ERROR</MessageType>

但是如果我執行命令:

egrep -wi 'error|exception' /temp/log.log | grep -vi '<STATUS>ERROR</STATUS>'

它仍然給出輸出:

ERROR
EXCEPTION
exception
<STATUS>ERROR</STATUS>
<MessageType>ERROR</MessageType>

而我期待:

ERROR
EXCEPTION
exception
<MessageType>ERROR</MessageType>

為什麼會這樣?

出現問題是由於egrep -w 'error|exception'. 此命令在模式(即錯誤或異常)之前和之後添加特殊字元,以在 grep 結果中突出顯示這些模式。

正如哈拉爾所說。‘ERROR’ 模式與 grep 輸出語句不匹配,因為 grep 輸出中的 STATUS 標記之間的 ‘ERROR’-w標誌添加了一些特殊字元。

因此,當egrep’ 結果發送到grep -v命令時,它無法匹配模式。

引用自:https://unix.stackexchange.com/questions/239461