如果我運行grep foo bar.txt
, grep 會突出顯示bar.txt
.但有時我想用find
grep 來決定搜尋哪些檔案。所以我做了這樣的事情:
find . -iname "*.abc" | xargs grep foo
或這個:
find . -iname "*.abc" -exec grep foo {} \;
在這兩種情況下,grep 都能正確找到指定檔案中出現的“foo”,但輸出沒有任何突出顯示。
如何繼續使用find
grep 選擇要搜尋的檔案而不遺失反白?
我在 Ubuntu 12.04 上執行 Gnome Terminal 3.4.1.1,使用 bash 作為 shell。
答案1
在這兩個命令中,問題在於不是grep
另一個命令產生實際輸出(分別是xargs
和find
)。
您可以透過直接呼叫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 取得有關匹配的附加數據