grep命令可以高效查询处理大量的文本文件,Windows下也有与之类似的findstr。最近在Windows上处理LoadRunner的大量log,使用findstr提高了效率,解决了很多问题。
语法
1 | findstr [/b] [/e] [/l] [/r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/p] [/offline] [/g:file] [/f:file] [/c:string] [/d:dirlist] [/a:ColorAttribute] [strings] [[Drive:][Path] FileName [...]] |
参数说明
/b :匹配行的起始/e :匹配行的末尾/l :使用字符串的文本内容来查询/r :使用正则表达式来查询。除非使用/l,都会将匹配字符串中的元字符认为是正则表达式/s :查询当前目录及子目录下的所有文件/i :指定查询时不区分字母的大小写/x :输出完全匹配的行/v :输出不包含匹配的行/n :在输出显示时带上行号/m :只输出包含匹配内容的文件名/o :在每个匹配的行前输出字符偏移量/p :跳过包含不可打印字符的文件/offline :使用脱机属性设置处理文件/f: file :从指定的文件中读取待查询的目标文件/c: string :使用指定的文本作为文字搜索字符串/g: file :从指定的文件中读取查询字符串/d: dirlist :查找以逗号为分隔符的目录列表/a: ColorAttribute :使用两个十六进制数指定颜色属性strings :指定查询内容字符串[ Drive : ][ Path ] FileName […] :指定查询的目标文件/? :查询帮助
使用正则表达式
findstr中支持的正则表达式见下表:
| 字符 | 值 |
|---|---|
| . | 通配符:任何字符 |
| * | 重复:零次或多次出现的字符或类 |
| ^ | 位于行首 |
| $ | 位于行尾 |
| [class] | 字符类,其中的任何一个字符 |
| [^class] | 反字符类,不包含其中的任何字符 |
| [x-y] | 范围:指定范围内的任何字符 |
| \x | 转义符号:将元字符x用作文本字符 |
| \<xyz | 位于单词开头 |
| xyz\> | 位于单词末尾 |
用例
在不使用/c时,可使用空格来分隔多个查询字符串,如要在文件x.y中查找字符串"hello"或"there":
1 | findstr "hello there" x.y |
在文件x.y中查找字符串"hello there"需要加/c:
1 | findstr /c:"hello there" x.y |
查找文件Proposal.txt中所有出现的"Windows",匹配大小写:
1 | findstr Windows proposal.txt |
查找当前目录及所有子目录下所有文件中出现的"Windows",不区分大小写:
1 | findstr /s /i Windows *.* |
查找所有包含有字符串"FOR",且"FOR"之前以任意数量的空格作为起始的行,并且在显示时打印出行号:
1 | findstr /b /n /c:" *FOR" *.bas |
如果需要对同一组文件进行几种不同的查询,可以创建一个文件且每行保存一个查询标准。当然也可以将待查询的文件放入一个文本文件。如果需要使用Finddata.txt中的查询标准,将Filelist.txt中的文件作为查询对象,并且将查询结果存储到Results.out,命令如下:
1 | findstr /g:finddata.txt /f:filelist.txt > results.out |
如果需要在当前目录及子目录下的所有文件中查找"computer",不区分大小写,且输出内容为所有包含有"computer"的文件名,命令如下:
1 | findstr /s /i /m "\<computer\>" *.* |
如果需要查找的单词不止"computer",还包含其它以comp开头的单词如"compliment"和"compete"等,则命令为:
1 | findstr /s /i /m "\<comp.*" *.* |