基礎(chǔ)
用于從提交歷史或者工作目錄中查找一個字符串或者正則表達(dá)式。
grep 不能查找未跟蹤的文件霉祸。
-
基本格式為
git grep <content> <sha1> file...
會輸出所有包含 content 的行瘦陈。基礎(chǔ)格式中嘹朗,可以省略 sha1 與 file蔓同。
不指定 sha1 值時传睹,就在當(dāng)前工作目錄中進(jìn)行查找。指定 sha1 值時模暗,會在指定的版本中進(jìn)行查找禁悠。
不指定 file 時,會查找所有文件兑宇;指定文件時碍侦,會查找指定的文件。
在基本格式的最后可以指定多個文件。
該命令會遞歸查找子文件瓷产。所以不需要額外的參數(shù)指定成遞歸模式站玄。
$ git grep xx
test.html:xxx
xxx.xxx:xxxxxx 修
命令用于查找所有包含字符串 xx 的行。
如果指定了文件濒旦,則只會查找指定文件中滿足條件的行株旷。
常用選項
選項 | 含義 |
---|---|
-n | 輸出匹配項所在的行 |
--count 或 -c | 輸出文件中匹配的個數(shù) |
-p | 查看匹配的行屬于哪一個方法 |
--name-only | 只顯示文件名 |
-i | 查找的內(nèi)容不區(qū)分大小寫 |
-e | 后跟正則表達(dá)式 |
-v | 顯示不滿足條件的行 |
基本選項
如:
$ git grep -n xx
test.html:2:xx
xxx.xxx:1:xxx
$ git grep --count xx
test.html:1
xxx.xxx:1
第一個命令表示從當(dāng)前工作目錄中查找含有字符串 xx 的行,并輸出尔邓。
第二個命令表示輸出每一個文件中能匹配字符串 xx 的次數(shù)晾剖。可以將 --count 換成 -c 梯嗽。
$ git grep -p a *.java
cid.java:private void a(){}
cid.java=public void b(){
cid.java: a();
倒數(shù)第二行輸出了 a() 函數(shù)的調(diào)用者為 b() 函數(shù)齿尽,雖然該行沒有包含字符 a。
一般來說灯节,使用 -p 時循头,需要將查找范圍限定在源文件。如上例中炎疆,使用 *.java
限定只查找后綴名為 java 的文件贷岸,這樣可以避免別的文件的干擾。
-v
用于顯示不滿足條件的行磷雇。
如:
$ cat test
Transfer your stuff from iOS in 3 easy steps.
First, download Google Drive to your iOS device and sign in with your Google account.
If you don’t have a Google account,
You can create one now or when you sign in to Google Drive.
$ git grep -v -i 'google'
test:Transfer your stuff from iOS in 3 easy steps.
test:
第一個命令用于獲取當(dāng)前 test 文件的內(nèi)容偿警。第二個命令用于顯示不滿足 google (不區(qū)分大小寫情況下) 的行。
-e
-e 選項后面跟正則表達(dá)式唯笙。
注意:
- 使用時螟蒸,需要將 {、} 進(jìn)行轉(zhuǎn)義崩掘。
如:
$ git grep -ni -e 'o\{2\}'
test:2:First, download Google Drive to your iOS device and sign in with your Google account.
test:3:If you don’t have a Google account,
test:4:You can create one now or when you sign in to Google Drive.
在不區(qū)分大小寫的情況下七嫌,獲取含有兩個字母 o 的行。如果上述命令不對 {} 進(jìn)行轉(zhuǎn)義會報錯苞慢。
邏輯關(guān)系
選項 | 含義 |
---|---|
--and | 與诵原。表示表示必須滿足 |
--or | 或。表示條件滿足一個即可 |
--not | 否挽放。不能滿足指定的條件 |
() | 修改邏輯執(zhí)行順序绍赛。小括號內(nèi)的先執(zhí)行 |
默認(rèn)的邏輯關(guān)系是 --or
。
使用 () 時一定要注意:需要對 ( 和 ) 進(jìn)行轉(zhuǎn)義辑畦,同時 ( 和 ) 與具體內(nèi)容之間應(yīng)通過空格隔開吗蚌。
下面操作的所有文件都與 -v 時文本相同。
-
如果想獲取含有 google 字樣和數(shù)字的行纯出,可以使用如下命令:
$ git grep -n -i -e 'google' --and -e '[0-9]'
可以發(fā)現(xiàn)蚯妇,沒有輸出的內(nèi)容敷燎。因為文本中沒有滿足指定條件的行。
-
如果想要獲取含有 google 字樣或數(shù)字的行箩言。命令如下:
$ git grep -n -i -e 'google' -e '[0-9]' test:1:Transfer your stuff from iOS in 3 easy steps. test:2:First, download Google Drive to your iOS device and sign in with your Google account. test:3:If you don’t have a Google account, test:4:You can create one now or when you sign in to Google Drive.
在命令中第二個
-e
之前省略了--or
硬贯。因為默認(rèn)的就是 or。可以發(fā)現(xiàn)將所有的行都輸出了陨收。因為第一行含有數(shù)字 3饭豹,其余行含有 Google,在忽略大小寫的情況下可以匹配
google
畏吓。
-
如果要獲取含有 google 墨状,同時不能含有 ios 的行。命令如下:
$ git grep -n -i -e 'google' --and --not -e 'ios' test:3:If you don’t have a Google account, test:4:You can create one now or when you sign in to Google Drive.
命令中通過 --not 對表達(dá)式進(jìn)行否定菲饼。因為第二行含有 ios 字樣肾砂,所以不滿足
--not -e 'ios'
條件,無法被輸出宏悦。
-
--and 優(yōu)先級高于 --or镐确。如:
優(yōu)先級從中可以看出,所以行都滿足條件饼煞。因為第一行滿足 or 前面的條件源葫,而剩余的三行滿足后面的條件。
-
可以通過使用 () 使 or 先執(zhí)行砖瞧。如:
$ git grep -n -i -e 'ios' --and \( -e '[0-9]' --or -e 'google' \) test:1:Transfer your stuff from iOS in 3 easy steps. test:2:First, download Google Drive to your iOS device and sign in with your Google account.
上述命令查找的行必須含有字符串 ios 息堂,同時也必須有數(shù)字或 google。因此块促,只有一荣堰、二行滿足條件。
在寫命令時竭翠,( 與 ) 都進(jìn)行了轉(zhuǎn)義振坚,同時 ( 、 ) 與具體的內(nèi)容 ( 即 -e '[0-9]' --or -e 'google' ) 都使用空格進(jìn)行了分隔斋扰。
指定版本
grep 命令可以查詢指定版本中滿足條件的語句渡八。
使用該功能可以 導(dǎo)出指定版本的指定文件。
如:
$ cat aa
a11
a2
a33
$ git grep -e '[\s\S]*' HEAD~ -- aa
HEAD~:aa:a11
HEAD~:aa:a2
使用的正則表達(dá)式可以匹配任何字符传货,因此輸出時屎鳍,會輸出 HEAD~ 版本中 aa 文件的所有內(nèi)容。