【批處理】轉載:Findstr 的用法

感受該命令的問題在於,查找Word文檔就不行了,只能在文檔文件中。。。php

在文件中尋找字符串。 
正則表達式

複製代碼 代碼以下:編程


FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file] 
[/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] 
strings [[drive:][path]filename[ ...]] 

/B 在一行的開始配對模式。 
/E 在一行的結尾配對模式。 
/L 按字使用搜索字符串。 
/R 將搜索字符串做爲正則表達式使用。 
/S 在當前目錄和全部子目錄中搜索匹配文件。 
/I 指定搜索不分大小寫。 
/X 打印徹底匹配的行。 
/V 只打印不包含匹配的行。 
/N 在匹配的每行前打印行數。 
/M 若是文件含有匹配項,只打印其文件名。 
/O 在每一個匹配行前打印字符偏移量。 
/P 忽略有不可打印字符的文件。 
/OFF[LINE] 不跳過帶有脫機屬性集的文件。 
/A:attr 指定有十六進位數字的顏色屬性。請見 "color /?" 
/F:file 從指定文件讀文件列表 (/ 表明控制檯)。 
/C:string 使用指定字符串做爲文字搜索字符串。 
/G:file 從指定的文件得到搜索字符串。 (/ 表明控制檯)。 
/D:dir 查找以分號爲分隔符的目錄列表 
strings 要查找的文字。 
[drive:][path]filename 
指定要查找的文件。 

除非參數有 /C 前綴,請使用空格隔開搜索字符串。 
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中尋找 "hello" 或 
"there"。'FINDSTR /C:"hello there" x.y' 文件 x.y 尋找 
"hello there"。 

正則表達式的快速參考: 
. 通配符: 任何字符 
* 重複: 之前字符或類出現零或零以上次數 
^ 行位置: 行的開始 
$ 行位置: 行的終點 
[class] 字符類: 任何在字符集中的字符 
[^class] 補字符類: 任何不在字符集中的字符 
[x-y] 範圍: 在指定範圍內的任何字符 
\x Escape: 元字符 x 的文字用法 
\<xyz 字位置: 字的開始 
xyz\> 字位置: 字的結束 
學習


有關 FINDSTR 常見表達法的詳細狀況,請見聯機命令參考。 
這則幫助信息中,我將「通常表達式」,所有替換成了「正則表達式」(一切都是機器翻譯惹的禍)。 

命令歸納: 
findstr,全英文find string,意爲「查找字符串」; 

/b,全英文begin,意爲「開始」; 
/e,全英文end,意爲「末端」; 
/l,literally,意爲「照字面地」;引伸爲「去正則表達式」。 
/r,regular,意爲「有規律的」;引伸爲「正則表達式」。 
/s,subdirectory,意爲「子目錄」; 
/i,ignore,意爲「忽略」;引伸爲「忽略大小寫」; 
/x,exactly,意爲「剛好地」;引伸爲「徹底匹配」;(一開始意爲不是這個單詞,不過HAT確實高明――之因此以e爲縮寫,是由於前面有了end的縮寫,因此以第二個字母x爲縮寫)。 
/v,invert,意爲「反轉、使顛倒」(感謝doupip的單詞提供); 
/n,全英文number,意爲「數字」;引伸爲「行號」; 
/m,merely,意爲「只是」; 
/o,offset,意爲「偏移」; 
/p,print,意爲「打印」; 
/off[line],意爲「脫機文件」; 
/a,attribute,意爲「屬性」; 
/f,file,意爲「文件」; 
/c,case,意爲「把幾個字加起來」;引伸爲「所有字匹配」; 
/g,get,意爲「得到」; 
/d,directory,意爲「目錄」; 
class,類。 

感謝HAT的單詞提供。 

感謝weichengxiehou。 

參數詳解部分13-14節都是從weichengxiehou的帖子裏複製來的(既然有現成了,省心多少),原帖地址。 


參數詳解: 
學習findstr須要大量的實踐體會,因此須要新建一些txt文本以供測試。 

a.txt的內容(a.txt的內容在後面會屢次修改,請注意!): 
測試

複製代碼 代碼以下:字體


Hello World 
Hello Boy 
hello ,good man. 
goodbye! 
spa


1.最簡單的應用:在指定文本中查找指定字符串 
代碼: 
.net

複製代碼 代碼以下:翻譯


findstr "hello" a.txt 
code


結果: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr "hello" a.txt 
hello ,good man. 


代碼: 

複製代碼 代碼以下:


findstr "Hello" a.txt 


結果: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr "Hello" a.txt 
Hello World 
Hello Boy 


這裏能夠看出, 
findstr默認是區分大小寫的(跟find命令同樣)――找hello就不會出現Hello,反之亦然。 
怎麼讓其不區分大小寫呢? 
用/i參數! 
例如: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /i "Hello" a.txt 
Hello World 
Hello Boy 
hello ,good man. 


2.顯示要查找的字符具體在文本哪一行 
代碼:C:\Users\helloworld\Desktop>findstr /n /i "hello" a.txt 
複製代碼效果: 

複製代碼 代碼以下:


1:Hello World 
2:Hello Boy 
3:hello ,good man. 


顯示的結果中冒號(:)是英文格式下的,在用for提取的時候須要注意! 
這裏能夠對比一下find命令的/n參數: 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>find /n "hello" a.txt 


效果:---------- A.TXT 
[3]hello ,good man. 
複製代碼冒號(:)和中括號([]),這就是差異,編寫代碼的時候必定要注意。 
3.查找包含了指定字符的文本 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /m /i "hello" *.txt 


效果: 

複製代碼 代碼以下:


1.txt 
a.txt 


1.txt中的類容以下:除非參數有 /C 前綴,請使用空格隔開搜索字符串。 
例如: 

複製代碼 代碼以下:


'FINDSTR "hello there" x.y' 在文件 x.y 中尋找 "hello" 或 
"there"。'FINDSTR /C:"hello there" x.y' 文件 x.y 尋找 
"hello there"。 
[code] 
因爲加上了/m參數,因此只列出包含指定字符的文件名。 
4.查找以指定字符開始或結尾的文本行 
這個功能和前面介紹的最大不一樣就在於涉及到了「元字符」,若是你不明白什麼是「元字符」,那也不用擔憂學很差這一節,這就好像不明白「water」是什麼,也不會影響喝水。 
a.txt內容: 
[code] 
good hello 
你好 hello world 
Hello World 
Hello Boy 
hello ,good man. 
goodbye! 


如何查找以hello(忽略大小寫)開始的行? 
兩種方法: 
①./b參數 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /b /i "hello" a.txt 


效果: 

複製代碼 代碼以下:


Hello World 
Hello Boy 
hello ,good man. 


good hello 和 你好 hello world,這兩行都沒有顯示出來,由於hello不在行的開始處。 
②.^符 
這裏的^可不是轉義符,而是正則表達式中的「匹配行開始的位置」。 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /i "^hello" a.txt 


效果: 

複製代碼 代碼以下:


Hello World 
Hello Boy 
hello ,good man. 


學完了以查找指定字符開始的行,下面學習查找以指定字符結尾的行。 
如何查找以hello(忽略大小寫)結尾的行? 
一樣有兩種方法: 
①./e參數 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /e /i "hello" a.txt 


結果: 

複製代碼 代碼以下:


good hello 


只顯示了「good hello」,由於其它行雖然有「hello」,可是他們都沒有以「hello」結尾。 
②.$符 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /i "hello$" a.txt 


結果:good hello 
到此,咱們已經學習了兩個正則表達式的元字符:^和$(分別和他們功能相對應的有/b、/e參數)。 
5.查找與指定字符徹底匹配的行 
首先修改a.txt的內容: 

複製代碼 代碼以下:


hello 
hello hello 
good hello 
你好 hello world 
Hello World 
Hello Boy 
hello ,good man. 
goodbye! 


懂得觸類旁通的的童鞋可能會試着嘗試如下代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /n /i "^hello$" a.txt 


結果讓你倍感欣喜:1:hello 
其實除了這一種方法外,findstr命令還提供了/x參數用來查找徹底匹配的行。 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /n /i /x "hello" a.txt 


結果: 

複製代碼 代碼以下:


1:hello 


6.關閉正則表達式會怎麼樣? 
咱們能夠人爲地將findstr分爲兩種模式,「正則表達式模式」和「普通字符串模式」。 
findstr默認爲「正則表達式模式」,加上/r參數也是「正則表達式模式」(換言之,/r參數有點多餘)。 
加上/l參數後,findstr轉換爲「普通字符串模式」(其實find就是這種模式、且只有這種模式)。 
「普通字符串模式」下,以一樣的代碼,看看結果怎樣? 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /li "^hello" a.txt 


結果什麼都沒顯示出來。 
以hello開頭的行明明有如下這些,爲何沒顯示出來呢? 

複製代碼 代碼以下:


hello hello 
Hello World 
Hello Boy 
hello ,good man. 


由於,當你使用「普通字符串模式」,findstr不會把^當作是正則表達式的元字符,而只是把其當作普通字符^,也就是說它此時已經不具有「表示行首」的功能,變成了和h之類字符同樣的普通民衆,再也沒「特權」。 
改變a.txt的內容:^hello 

複製代碼 代碼以下:


hello 
hello hello 
good hello 
你好 hello world 
Hello World 
Hello Boy 
hello ,good man. 
goodbye! 


再次運行代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /nli "^hello" a.txt 


結果: 

複製代碼 代碼以下:


1:^hello 


7.查找不包含指定字符的行 
若是比較一下find和findstr命令就會發現,他們都具備/v,/n,/i,/off[line]參數,並且功能都是一摸同樣的,這裏說的就是/v參數。 
查找不包含hello的行。 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /vni "hello" a.txt 


結果: 

複製代碼 代碼以下:


9:goodbye! 


8.如何查找當前目錄及子目錄下文件內容中包含某字符串的文件名? 
在寫這篇教程的時候,偶然看到有批友問了這個問題,問題地址:http://bbs.bathome.net/viewthread.php?tid=14727 
代碼: 

複製代碼 代碼以下:


findstr /ms "專業" *.txt 


效果: 
找出當前目錄及子目錄下文件內容中包含「專業」的文本文件,並只顯示其文件名。 
9.用文本制定要查找的文件 And 用文本制定要查找的字符串 
用文本制定要查找的文件 
新建一個file.txt,內容以下(這個文本中指定findstr要查找的文本的路徑): 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop\1.txt 
C:\Users\helloworld\Desktop\a.txt 
C:\Users\helloworld\Desktop\clip.txt 
C:\Users\helloworld\Desktop\CrLf 批處理筆記.txt 
C:\Users\helloworld\Desktop\file.txt 
C:\Users\helloworld\Desktop\MyRarHelp.txt 
C:\Users\helloworld\Desktop\test.txt 
C:\Users\helloworld\Desktop\紅樓.txt 
C:\Users\helloworld\Desktop\520\新建文本文檔.txt 
C:\Users\helloworld\Desktop\520\12\hello_ world.txt 
C:\Users\helloworld\Desktop\編程\help.txt 
C:\Users\helloworld\Desktop\編程\win7 help比xp help多出來的命令.txt 
C:\Users\helloworld\Desktop\編程\wmic.txt 


代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /f:file.txt /im "hello" 


效果: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop\1.txt 
C:\Users\helloworld\Desktop\a.txt 
C:\Users\helloworld\Desktop\CrLf 批處理筆記.txt 
C:\Users\helloworld\Desktop\file.txt 
C:\Users\helloworld\Desktop\test.txt 


用文本制定要查找的字符串 
新建一個string.txt,內容以下(這個文本中指定findstr要查找的字符串): 

複製代碼 代碼以下:


^hello 
world 


a.txt 

複製代碼 代碼以下:


^hello 
hello 
hello hello 
good hello 
你好 hello 
Hello World 
Hello Boy 
hello ,good man. 
goodbye! 


代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /ig:string.txt a.txt 


效果: 

複製代碼 代碼以下:


hello 
hello hello 
Hello World 
Hello Boy 
hello ,good man. 


被忽略的行 

複製代碼 代碼以下:


^hello 
good hello 
你好 hello 
goodbye! 


從被忽略的「^hello」能夠看出,在不加/l參數的前提下,用/g指定的搜索字符串中若是含有「元字符」,則做爲正則表達式使用,而不是做爲普通表達式。 
10.搜索一個徹底匹配的句子 
其實findstr自帶的幫助中就有個很好的例子: 
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中尋找 "hello" 或 
"there"。'FINDSTR /C:"hello there" x.y' 文件 x.y 尋找 
"hello there"。 
能夠以這個例子來作個測試。 

複製代碼 代碼以下:


a.txthello there 
hellothere 
hello 
there 


代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /ic:"hello there" a.txt 


結果: 

複製代碼 代碼以下:


hello there 


這就是句子的徹底匹配了。 
11.搜索一個徹底匹配的詞。 
這裏也涉及到了兩個元字符:\<,\>。 
先試看一個例子。 
a.txt 

複製代碼 代碼以下:


far there 
farthere 
there 
far 
farm 
farmer 


代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr "far" a.txt 


結果: 

複製代碼 代碼以下:


far there 
farthere 
far 
farm 
farmer 


個人本意是要查找含有「far」這個單詞的行,可是farthere、farm、farmer卻顯示出來了,這不是我想要的結果。 
若是隻要求顯示含有「far」這個單詞的行,該怎麼寫呢? 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr "\<far\>" a.txt 


結果: 

複製代碼 代碼以下:


far there 
far 


12.指定要查找的目錄 
/d參數我一直把它和/f、/g歸爲一類,但其實兩者大相徑庭,/f、/g是用文本文件制定要查找的文件、字符串,而/d是直接書寫目錄名到命令中。 
代碼: 

複製代碼 代碼以下:


C:\Users\helloworld\Desktop>findstr /imd:520;編程; ".*" "*.txt" 


結果: 

複製代碼 代碼以下:


520: 
hello.txt 


編程: 
help.txt 

複製代碼 代碼以下:


win7 help比xp help多出來的命令.txt 
wmic.txt 


查找在520、編程目錄中全部包含任意字符的txt文件。 
13.統計字符數 
/o:在每行前打印字符偏移量,在找到的每行前打印該行首距離文件開頭的位置,也就是多少個字符,如test.txt中有以下內容: 

複製代碼 代碼以下:


aaaaaaaaaa 
aaaaaaaaaa 
aaaaaaaaaa 
aaaaaaaaaa 
aaaaaaaaaa 
aaaaaaaaaa 


執行命令:findstr /o .* test.txt 
複製代碼::上一行中的.*爲正則表達式的內容,表示任意行,包含空行 
結果以下: 

複製代碼 代碼以下:


0:aaaaaaaaaa 
12:aaaaaaaaaa 
24:aaaaaaaaaa 
36:aaaaaaaaaa 
48:aaaaaaaaaa 


注意每行末尾的回車換行符算兩個字符。 
14.以指定顏色顯示文件名 
/a:當被搜索文件名中含有通配符*或?時對搜索結果的文件名部分指定顏色屬性,具體顏色值參見color幫助: 
0 = 黑色 8 = 灰色 
1 = 藍色 9 = 淡藍色 
2 = 綠色 A = 淡綠色 
3 = 淺綠色 B = 淡淺綠色 
4 = 紅色 C = 淡紅色 
5 = 紫色 D = 淡紫色 
6 = 黃色 E = 淡黃色 
7 = 白色 F = 亮白色 
經常使用於彩色顯示,舉個簡單的例子,想要彩色顯示「批處理之家」怎麼辦,假如當前的color設置爲27(背景綠色,字體白色),用藍色顯示「批處理之家」咋辦?::下一行的退格符能夠在cmd的編輯模式下按ctrl+p後按退格鍵得到>"批處理之家" set /p=<nul 

複製代碼 代碼以下:


>"批處理之家" set /p=<nul 
findstr /a:21 .* "批處理之家*" 
pause 


代碼中的退格符是爲了讓顯示的內容僅爲"批處理之家",若是有其餘內容,在彩色顯示的"批處理之家"後還有一個冒號和其餘內容,退格符正好將冒號刪除。注意代碼中的通配符是必須的。 
15.findstr中的元字符 
16.未講解的內容:/p,/off[line] 
這兩個命令不明白是什麼意思,由於不知道什麼是「不可打印字符」、「帶有脫機屬性集的文件」,望有識之士給予解答。

相關文章
相關標籤/搜索