首页 > 技术文章 > 常用DOS命令之find和findstr的用法详解

mq0036 2020-10-16 12:47 原文

1.字符串查找:find
2.字符串查找增强:findstr

一.字符串查找:find

在文件中搜索字符串。
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] “string” [[drive:][path]filename[ …]]

/V        显示所有未包含指定字符串的行。
/C        仅显示包含字符串的行数。
/N        显示行号。
/I        搜索字符串时忽略大小写。
/OFF[LINE] 不要跳过具有脱机属性集的文件。
“string”   指定要搜索的文字串,
[drive:][path]filename   指定要搜索的文件。

基本格式:find “要查找的字符串” 要查找的文件(不在当前目录则需要给出完整路径)

1
find "abc" d:\abc.txt
abc.txt中查找字符串abc的行。/I 搜索字符串时忽略大小写。2
find /i "abc" d:\abc.txt
参数/i代表的是“Ignore”(忽略),也就是忽略大小写。通过/I 参数可以不区分要查找的字符串“abc”的大小写。/N 显示行号。3
find /n "abc" d:\abc.txt
参数/n代表英语单词“Number”(号码).。通过/n参数我们可以查找到字符串"abc"所在的行号。/C 仅显示包含字符串的行数。4
find /c "abc" d:\abc.txt
参数/c是英语单词“Count”(计数)的缩写。通过/c参数我们可以统计包含"abc"字符串的行数。/显示所有未包含指定字符串的行。5
find /v "abc" d:\abc.txt
这个参数用于找出文件中不包含指定字符串的行。在这里表示查找不包含"abc"字符串的行。注意:find命令中要查找的字符串一字要用双引号" "括起来。

二.字符串查找增强:findstr

在文件中寻找字符串。
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/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”。

1.基本格式:findstr ” strings ” [drive:][path]filename

Strings  是要查找的内容。
[rive:][path]filename  指定要查找的文件,路径可缺省,缺省情况下为当前目录。

1
findstr "icq"123.txt123.txt中查找包含有“icq”这三个字符串的行。/指定搜索不分大小写。2
findstr /i "MSN"123.txt123.txt中查找包含有“MSN”这三个字符的行,且不区分大小写。★/R 将搜索字符串作为正则表达式使用。参数/R 强调以正则表达式规则来解读字符串。R -Right右即为正。我们都说右手是正手,因此引申为右为正,左为反。3
findstr /r "icq msn"123.txt123.txt中查找包含有icq”或“msn”的行,查找的多个字符串间用空格隔格开。


 /S 在当前目录和所有子目录中搜索。4
findstr /s /i "MSN"*.txt
在当前目录和所有子目录中的txt文件中搜索字符串"MSN"(不区分字母大小写)。/C:string使用指定字符串作为文字搜索字符串。5
findstr /c:"icq msn"123.txt123.txt中查找包含有icq msn”这几个字符的行。注意,这里“icq msn”是一整体的。此参数多用于查找含有空格的字符串。★在使用 findstr "我 你 他" test.txt 的时候,并不能查找到内容,但是,加上开关/i 或者/r 之后就正确无误了,可能是在查找多个纯中文字符串的时候的一个bug吧;单个的纯中文字符串没有任何问题。

2.findstr 命令中正则表达式的用法规则

一般表达式的快速参考:
.        通配符: 任何字符
*        重复: 以前字符或类别出现零或零以上次数
^        行位置: 行的开始
$        行位置: 行的终点
[class]  字符类别: 任何在字符集中的字符
[^class] 补字符类别: 任何不在字符集中的字符
[x-y]    范围: 在指定范围内的任何字符
\x       Escape: 元字符 x 的文字用法
\<xyz    字位置: 字的开始
xyz\>    字位置: 字的结束

● 通配符和重复符规则,即 . 和 *
通配符,即一个句点,代表任何一个字符,而且只能是一个,包括字母、数字、半角符号还有空格。
重复符,即型号* 代表前面字母的出现次数(出现次数从0到多次,0表示没有)。

findstr . 123.txt 或 findstr “.” 123.txt
在文件123.txt中查找任意字符,不包括空行。

6
findstr .*2.txt findstr ".*"2.txt在文件123.txt中查找任意字符,包括空行。7
findstr ac*123.txt 
在文件123.txt中查找出现一个“a”字符串,以及a后面出现过0次或者任意次c的字符行。如:
a 
ac
acc
addc
等都匹配。8
findstr ak5*123.txt 
在文件123.txt中查找出现一个“ak”字符串,以及ak后面出现过0次或者任意次5的字符行。如:
ak
ak5
akbbb
ak125
ak555
等都匹配。●行首、行尾符规则,即^ $

9
findstr "^step"123.txt在文件123.txt中查找行首为step字符串的行。如:
stepkdka
step 456这两行都匹配的。10
findstr "step$"123.txt在文件123.txt中查找行尾为step字符串的行。如:123 dstep
123step这两行也匹配的。11
findstr "^step$"123.txt在文件123.txt中查找行首为step,且行尾也为step的行,即step独自一行。

● 字符集规则,即[class]
①表示含有集里的任意一个字符的即匹配。
②该字符集里的元素可以是字母和数字和一般的半角字符,如:}{ ,.][等,但双引号”不被识别。不能是汉字, 汉字
不被正确解释(汉字不是ASCII码)。
如果在字符集内插入通配符和重复符号,即”[.*]”将会把. 和 *视为普通字符,没有通配和重复的含义。

12
findstr "[0-9]"123.txt在文件123.txt中查找数字09的任意之一的行。如:4kkb1 lkka cc
这两行都匹配。13
findstr "[a-zA-Z]"123.txt在文件123.txt中查找包括任意字母行。14
findstr "[abcezy]"2.txt在文件123.txt中查找包括a b c e z y其中任意一字母的行。15
findstr "[a-fl-z]"2.txt在文件123.txt中查找小写字符af lz的任意一字母的行,但不包含g h I j k这几个字母。16
findstr "M[abc][123]Y"2.txt在文件123.txt中查找可以匹配Ma1Y,Mb1Y,Mc1Y;Ma2Y,Mb2Y,Mc2Y;Ma3Y,Mb3Y,Mc3Y的行。

● 减法规则,即[^class]

17
findstr "[^0-9]"123.txt如果是纯数字的行便过滤掉,例如2323423423这样的字符串被过滤,345hh888这样的形式则过滤不了。注意,纯数字的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!18
findstr "[^a-z]"123.txt如果是纯字母的行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf 这样的字符将被过滤,如果是sdfksjdkf99999这样的形式则过滤不了。注意,纯字母的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!19
findstr "[^add]"123.txt过滤仅含有由a d d三个字母组成的纯字母字符串的行。 
如:
a
ad
ddaadd
dd
这些行都会被过滤。注意,仅含有由a d d三个字母组成的纯字母字符串的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!20
findstr "[^echo]"123.txt过滤仅含有由e  c  h  o 四个字母组成的纯字母字符串的行。 
如:
e
c
ec
cho
chooo
这些行都会被过滤。

●单词前缀后缀定位规则,即\<xyz和xyz\>

该xyz可以是英文单词或数字,但不适用于汉字。符号 \ 理解为转义符,化解小于号和大于号的重定向命令含义。
该规则是匹配类似单个英文单词的。

21
findstr "\<echo"123.txt所有含有以echo为前缀的字符串的行,都匹配。如:
echo:kkk a add 
jjkk echo
这两行都匹配。(思考:为什么:echo也匹配?)22
findstr "echo\>"123.txt所有含有以echo为后缀的字符串的行,都匹配。如:
qq bbecho 这一行也匹配。 
(思考:为什么kkkk echo:也匹配?)23
findstr "\<end\>123.txt
这里是用来精确查找单词。查找单词end的行,
注意:
ended
cdkend
bcd-end-jjkk
这类词都不匹配。

(思考:为什么end echo和end也匹配?因为\<xyz\>格式要查找的是单个英文单词。)

● 转义符 \

把表达式中的特殊字符(元字符)转化为普通字符。常见写法:
\.
\*
\\
\[
\]??
\-

24
findstr "\.abc"123.txt在文件123.txt中查找可以匹配“.abc”字符串的行,这里\。是把。给转义了。25
findstr "1\\"123.txtfindstr "1\\\\"123.txt在文件123.txt中查找可以匹配“1\”字符串的行,这里\\是把\给转义了。

★要查找的字符串含有\时,可以用\\把\给转义;或者把\变成\\\\。如果目标字符串的\后面还有内容,则搜索字符
串\除了要变成\\(本身的转义要求),还可以在它后面再加一个字符,如\\.

 

出处:https://www.zhangqiongjie.com/695.html

===============================================================

Findstr 不能搜索 UTF-8 编码文件怎么办

方法一

用 grep 代替 findstr 命令来执行查找

 

方法二

如果可以的话,把bat文件和待查找到文件的编码格式,保存为ANSI编码格式

如果文件中包含unicode的字符,例如:Copyright ©  等,就无法保存ANSI格式的文件了

 

方法三

使用命令 chcp 修改 cmd 命令行,支持 utf-8 格式的文本显示,这个命令是用来显示当前活动代码页编号的

 如:chcp 65001

 

=============================================================================================== 

总结:
findstr和find 查找汉字时只能在936代码下使用,且查找的文件须为中文编码,utf-8格式会导致查找不到

一.区别

find 无正则
findstr 默认正则(推荐)

二.例子

test1.bat文件:

chcp 65001>nul
echo "你好 世界" |find "你好"
echo "你好 世界" |findstr "你好"
pause

无任何输出

 

test2.bat文件:

chcp 936>nul
echo "你好 世界" |find "你好"
echo "你好 世界" |findstr "你好"
pause

输出:
“你好 世界”
“你好 世界”

 

出处:https://blog.csdn.net/u012787710/article/details/96286295

===========================================================================================

CMD命令窗口中文乱码问题的解决

解决命令行的乱码以及编码的问题
命令 chcp
功能:
显示或设置活动代码页编号
  CHCP [nnn]
  nnn 指定代码页编号。
  不加参数键入 CHCP 显示活动代码页编号。
  nnn指定一已有的系统字符集,该字符集在CONFIG.SYS文件中由COUNTRY命令定义。
  在DOS下可以通过mode命令来设置代码页。
  选定代码页: MODE CON[:] CP SELECT=yyy
  代码页状态: MODE CON[:] CP [/STATUS]
  按Windows+R组合键,然后输入cmd或者command打开命令提示符。
  比如输入:mode con cp select=936,则表示显示简体中文。如果输入mode con cp select=437,则表示显示MS-DOS 美国英语,而中文显示将会是?。
  MS-DOS为以下国家和语言提供字符集:
  代码页描述
  1258 越南语
  1257 波罗的语
  1256 阿拉伯语
  1255 希伯来语
  1254 土耳其语
  1253 希腊语
  1252 拉丁 1 字符 (ANSI)
  1251 西里尔语
  1250 中欧语言
  950 繁体中文
  949 朝鲜语
  936 简体中文(默认)
  932 日语
  874 泰国语
  850 多语种 (MS-DOS Latin1)
  437 MS-DOS 美国英语
//补充
dos指令:
chcp 65001 就是换成UTF-8代码页
chcp 936 可以换回默认的GBK
chcp 437 是美国英语
如何在DOS窗口中显示UTF-8字符
在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容。在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集。
如果想正确显示UTF-8字符,可以按照以下步骤操作:
1、打开CMD.exe命令行窗口
2、通过 chcp命令改变代码页,UTF-8的代码页为65001
chcp 65001
执行该操作后,代码页就被变成UTF-8了。但是,在窗口中仍旧不能正确显示UTF-8字符。
3、修改窗口属性,改变字体
在命令行标题栏上点击右键,选择"属性"->“字体”,将字体修改为True Type字体"Lucida Console",然后点击确定将属性应用到当前窗口。
这时使用type命令就可以显示UTF-8文本文件的内容了:
type filename.txt
4、通过以上操作并不能完全解决问题,因为显示出来的内容有可能不完全。可以先最小化,然后最大化命令行窗口,文件的内容就完整的显示出来了

 

 出处:https://blog.csdn.net/river131/article/details/97242737

推荐阅读