當管道 find 進入 grep 時,如何保留 grep 的匹配突出顯示?

當管道 find 進入 grep 時,如何保留 grep 的匹配突出顯示?

如果我運行grep foo bar.txt, grep 會突出顯示bar.txt.但有時我想用findgrep 來決定搜尋哪些檔案。所以我做了這樣的事情:

find . -iname "*.abc" | xargs grep foo

或這個:

find . -iname "*.abc" -exec grep foo {} \;

在這兩種情況下,grep 都能正確找到指定檔案中出現的“foo”,但輸出沒有任何突出顯示。

如何繼續使用findgrep 選擇要搜尋的檔案而不遺失反白?

我在 Ubuntu 12.04 上執行 Gnome Terminal 3.4.1.1,使用 bash 作為 shell。

答案1

在這兩個命令中,問題在於不是grep另一個命令產生實際輸出(分別是xargsfind)。

您可以透過直接呼叫grep每個檔案名稱來解決此問題:

IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
    grep foo $FILE
done
unset IFS

或作為一句單行:

IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS

怎麼運作的:

  • IFS=$'\n'將內部欄位分隔符號設為換行符(否則檔案名稱中的空格將導致問題)。

  • for FILE in $(COMMAND); do COMMANDS done循環遍歷 指定的文件COMMAND,將變數設為FILE目前文件並執行COMMANDS.

  • grep foo $FILE搜尋並foo發送$FILE結果直接地到螢幕上。

  • unset IFS將內部欄位分隔符號設定回其預設值(腳本中不需要)。

答案2

只需grep再次輸出即可為其著色。

我在這裡做了類似的事情:從 grep 取得有關匹配的附加數據

相關內容