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.*" *.* |