script - unix grep options




使用grep--exclude/- 包含語法不通過某些文件grep (15)

在目錄中也有許多二進製文件。 我不能只搜索某些目錄(目錄結構是一團糟)。 只有在某些文件中有更好的方法才能進行grepping?

ripgrep

這是設計用於遞歸搜索當前目錄的最快捷的工具之一。 它被寫入Rust ,構建於Rust的正則表達式引擎之上,以實現最高效率。 在這裡查看詳細分析

所以你可以運行:

rg "some_pattern"

它尊重你的.gitignore並自動跳過隱藏的文件/目錄和二進製文件。

您仍然可以使用-g / --glob自定義包含或排除文件和目錄。 Globbing規則匹配.gitignore globs。 檢查man rg尋求幫助。

在macOS上,您可以通過brew install ripgrep進行brew install ripgrep

我正在尋找目錄樹中文本文件中的字符串foo= 。 它在一台普通的Linux機器上,我有bash shell:

grep -ircl "foo=" *

在目錄中還有許多與“foo =”匹配的二進製文件。 由於這些結果不相關並且減慢搜索速度,我希望grep跳過搜索這些文件(主要是JPEG和PNG圖像)。 我會怎麼做?

我知道有--exclude=PATTERN--include=PATTERN選項,但是模式格式是什麼? grep的手冊頁說:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

搜索grep includegrep include excludegrep exclude和variants找不到任何相關內容

如果只有在某些文件中有更好的選擇方式,我完全贊成。 移動違規文件不是一種選擇。 我不能只搜索某些目錄(目錄結構是一團糟,到處都是)。 另外,我無法安裝任何東西,所以我必須使用常用工具(如grep或建議的查找 )。


git grep

使用針對性能進行了優化的git grep ,旨在搜索某些文件。

默認情況下,它會忽略二進製文件,它正在履行您的.gitignore 。 如果你不使用Git結構,你仍然可以通過傳遞--no-index來使用它。

示例語法:

git grep --no-index "some_pattern"

要仍然排除某些文件,請參閱: 如何從git grep搜索中排除某些目錄/文件 。


grep 2.5.3引入了--exclude-dir參數,它將以您想要的方式工作。

grep -rI --exclude-dir=\.svn PATTERN .

你也可以設置一個環境變量:GREP_OPTIONS =“ - exclude-dir = .svn”

我會第二次參加投票,但這是最好的。


--binary-files=without-match選項讓GNU grep可以跳過二進製文件。 (相當於其他地方提到的-I開關。)

(這可能需要最近的grep版本;至少2.5.3版本。)


嘗試這個:

  1. 在currdir下創建一個名為“ --F ”的文件夾..(或將另一個文件夾重命名為“ --F ”,即double-minus-F
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *

在CentOS 6.6 / Grep 2.6.3上,我必須像這樣使用它:

grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"

注意缺少等號“=”(否則--include ,-- --excludeinclude-dir--exclude-dir被忽略)


如果你不反對使用find ,我喜歡它的-prune特性:

find [directory] \
        -name "pattern_to_exclude" -prune \
     -o -name "another_pattern_to_exclude" -prune \
     -o -name "pattern_to_INCLUDE" -print0 \
| xargs -0 -I FILENAME grep -IR "pattern" FILENAME

在第一行中,指定要搜索的目錄。 . (當前目錄)是一個有效的路徑,例如。

在第二行和第三行上,使用"*.png""*.gif""*.jpg"等。 使用盡可能多的這些-o -name "..." -prune結構,因為您擁有模式。

在第四行,您需要另一個-o (它指定“或” find ),您需要的模式,並且您需要在其末尾包含-print-print0 。 如果您只是在修剪*.gif*.png等圖像後需要“其他所有內容”,請使用-o -print0 ,然後完成第4行。

最後,第5行是xargs的管道,它將每個生成的文件都存儲在一個變量FILENAME 。 然後它傳遞grep -IR標誌, "pattern" ,然後FILENAMExargs擴展成為find的文件名列表。

對於您的特定問題,該陳述可能如下所示:

find . \
     -name "*.png" -prune \
     -o -name "*.gif" -prune \
     -o -name "*.svn" -prune \
     -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES


如果你只是想跳過二進製文件,我建議你看看-I (大寫字母i)選項。 它忽略了二進製文件。 我經常使用以下命令:

grep -rI --exclude-dir="\.svn" "pattern" *

它會遞歸搜索,忽略二進製文件,並且不會查看Subversion隱藏文件夾,無論我想要什麼樣的模式。 我的工作箱上有“grepsvn”的別名。


建議的命令:

grep -Ir --exclude="*\.svn*" "pattern" *

在概念上是錯誤的,因為--exclude在基本名稱上起作用。 換句話說,它只會跳過當前目錄中的.svn。


忽略來自grep的所有二進制結果

grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'

awk部分將過濾掉所有的二進製文件foo匹配行


我是一個dilettante,理所當然,但我的〜/ .bash_profile的外觀如下:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

請注意,要排除兩個目錄,我必須使用--exclude-dir兩次。


我發現grep grep的輸出有時會非常有用:

grep -rn "foo=" . | grep -v "Binary file"

雖然,這實際上並沒有阻止它搜索二進製文件。



請看看ack ,這是專為這些情況而設計的。 你的例子

grep -ircl --exclude=*.{png,jpg} "foo=" *

用ack完成

ack -icl "foo="

因為默認情況下,ack從不查找二進製文件,-r默認為打開。 如果你只想要CPP和H文件,那麼就做

ack -icl --cpp "foo="

適用於tcsh .alias文件:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

花了我一段時間才發現{mm,m,h,cc,c}部分不應放在引號內。 〜基思







grep