在批处理的过程中,经常需要查找文件以及在文件中查找相关字符串.在linux中有grep
,awk
,sed
等命令,不过windows里面也有类似的命令,如这次介绍的find
,findstr
.
find
用法
Usage:
1rem command: 2find [/v][/c][/n][/i] "string" [[drive:][path]filename]
Parameter:
/v
显示所有未包含指定字符串的行。/c
仅显示包含字符串的行数。/n
显示行号。/i
搜索字符串时忽略大小写。
案例
在文本test.txt中查找包含"Abc”的整行,并显示(不区分大小写)
1find /i “Abc” test.txt
``
在文本test.txt中查找不包含"Abc"的整行,并显示
1find /v "Abc" test.txt
``
在文本test.txt中查找"Abc"出现的次数
1find /n "Abc" test.txt
``
在字符串"abcdef”中查找"abc”(支持管道用法)
1echo abcdef | find "abc"
``
findstr–find的扩展
用法
Usage:
1rem Command: 2find [/v][/c][/n][/i] strings [[drive:][path]filename]
Parameter:
/b
在一行的开始配对模式。(就是指以字符串开头,begin 这样就方便了记忆)/e
在一行的结尾配对模式。(就是指以字符串结尾,end 这样就方便记忆)/l
按字使用搜索字符串。就是将后面的"“里的当成一个字符/r
将搜索字符串作为一般表达式使用。/s
在当前目录和所有子目录中搜索匹配文件。/i
指定搜索不分大小写。(英文:ignore 忽略)/x
打印完全匹配的行。/x 是指完全匹配,就是说整行匹配,而不是含有关键字./v
只打印不包含匹配的行。(就是找出不包含字符串的)/n
在匹配的每行前打印行数。(就是在输出行的前面加上原文件中的行数–number)/m
如果文件含有匹配项,只打印其文件名。(指定文件中输出含有字符串的文件名)/o
在每个匹配行前打印字符偏移量。o开关的作用是告诉你每行第一个字符前的位置是该文件中的第几个字节/C:string
使用指定字符串作为文字搜索字符串/G:file
从指定的文件获得搜索字符串。(/代表控制台)/F:file
从指定文件读文件列表 (/ 代表控制台)。/D:dir
查找以分号为分隔符的目录列表
Sign:.
通配符: 任何字符*
重复: 以前字符或类别出现零或零以上次数^
行位置: 行的开始$
行位置: 行的终点[class]
字符类别: 任何在字符集中的字符[^class]
补字符类别: 任何不在字符集中的字符[x-y]
范围: 在指定范围内的任何字符\x
Escape: 元字符 x 的文字用法\<xyz
字位置: 字的开始xyz\>
字位置: 字的结束\<
和\>
是单词锚定 ^是行首 $是行尾
案例
在文件x.y中搜索"hello"或"there”
1findstr "hello there" x.y
``
在文件x.y中搜索"hello there”
1findstr /c:"hello there" x.y
``
把1.txt中含有2.txt中任何一行内容的行输出来
1findstr /g:2.txt 1.txt 2rem 等价于: 3@echo off 4for /f "delims=" %%a in (2.txt) do ( 5 findstr "%%a" 1.txt 6) 7pause
``
行开始/结束与字开始结束
1findstr "cd\>" 1.txt 2rem 1.txt中两行"abcd"和"abcd e"都会出现
``
从文件2.txt中查找包括数字0-9的字符串或行
1findstr "[0-9]" 2.txt
``
匹配找到纯数字,如233432或匹配找到纯字母,如sdfsd
1findstr "^[0-9]*$" 2.txt 2findstr “^[a-z]*$" 2.txt
``
把1.txt文档中超过10个字符的行输入到2.txt中
1findstr .......... 1.txt > 2.txt
``
find和findstr的比较
- 统计含指定字符串的总行数。
find /c "abc" test.txt
可以统计test.txt中含有字符串abc的总行数,而findstr则没有直接提供该功能,需要配合for语句才能实现 - find可以读取Unicode格式的文本,而findstr则不行