Windows系统find和findstr命令
字符串搜索、查找、筛选命令
一、find语法
在一个或多个文件中搜索文本字符串,并显示包含指定字符串的文本行。
find [/v] [/c] [/n] [/i] [/off[line]] <"string"> [[<drive>:][<path>]<filename>[...]]
参数
| 参数 | 说明 |
|---|---|
| /v | 显示不包含指定 <string> 的所有行。 |
| /c | 对包含指定 <string> 的行进行计数,并显示总计。 |
| /n | 每行前面都有文件的行号。 |
| /i | 指定搜索不区分大小写。 |
| /off[line] | 如果文件设置了脱机属性,则不会被跳过。 |
<"string"> |
必需。 指定想要搜索的字符组(用引号括起来)。 |
[<drive>:][<path>]<filename> |
指定要在其中搜索指定字符串的文件的位置和名称。 |
| /? | 在命令提示符下显示帮助。 |
退出代码
| 退出代码 | 说明 |
|---|---|
| 0 | 已找到搜索的字符串 |
| 1 | 找不到搜索的字符串 |
| 2 | 找不到搜索的文件或提供了无效的命令行开关 |
注解
- 如果不使用 /i,此命令将搜索你为字符串指定的确切内容。 例如,此命令以不同的方式处理字符
a和A。 但是,如果使用 /i,搜索将不区分大小写,并且会将a和A视为相同的字符。 - 如果要搜索的字符串包含引号,则必须对字符串中包含的每个引号使用双引号(例如,“此字符串包含引号”)。
- 如果省略文件名,此命令将充当筛选器,从标准输入源(通常为键盘、管道 (|) 或重定向文件)获取输入,然后显示包含字符串的任何行。
- 若要退出控制台搜索,请使用
CTRL-X或CTRL-z。 - 可以按任意顺序键入 find 命令的参数和命令行选项。
- 搜索的字符串中不得出现通配符(* 和 ?)。 若要搜索具有通配符和正则表达式模式的字符串,可以使用 FINDSTR 命令。
- 如果在同一命令行中使用 /c 和 /v,此命令将显示不包含指定字符串的行计数。 如果在同一命令行中指定 /c 和 /n,则 find 将忽略 /n。
- 此命令无法识别回车符。 使用此命令搜索包含回车符的文件中的文本时,必须将搜索字符串限制为可在回车符之间找到的文本(即不太可能被回车中断的字符串)。 例如,如果在单词 tax 和 file 之间出现回车符,则此命令不会报告字符串 tax 文件的匹配项。
- 此命令接受文件名的通配符。 在一个文件或多个文件中搜索时,它将打印所处理的文件(前面有 10 个短划线)。
- Find 命令无法读取备用数据流。 若要在备用数据流中搜索,请使用 findstr、more 或 for /f 命令。
示例
若要显示包含字符串“pencil sharpener”的 pencil.md 中的所有行,请键入:
find "pencil sharpener" pencil.md
为了在 report.txt 文件中找到文本“科学家标明他们的论文仅供讨论,并不是最终报告。”(含引号),请键入:
find """The scientists labeled their paper for discussion only. It is not a final report.""" < report.txt
若要搜索一组文件,可以使用通配符。 若要在当前目录中搜索扩展名为 .bat 且包含忽略大小写的字符串 PROMPT 的文件,请键入:
find /i "PROMPT" *.bat
若要在包含字符串 CPU 的目录中查找文件名,请使用管道 (|) 将 dir 命令的输出定向到 find 命令,如下所示:
dir c:\temp /s /b | find "CPU"
查找不包含代理的所有正在运行的进程:
tasklist | find /v /i "agent"
检查服务是否正在运行:
sc query Winmgmt | find "RUNNING" >nul 2>&1 && (echo service is started) || (echo service is stopped)
二、findstr语法
findstr [/b] [/e] [/l | /r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/p] [/f:<file>] [/c:<string>] [/g:<file>] [/d:<dirlist>] [/a:<colorattribute>] [/off[line]] <strings> [<drive>:][<path>]<filename>[ ...]
参数
| 参数 | 说明 |
|---|---|
| /b | 如果文本模式位于行的开头,则匹配该模式。 |
| /e | 如果文本模式位于行的末尾,则匹配该模式。 |
| /l | 逐字处理搜索字符串。 |
| /r | 将搜索字符串作为正则表达式进行处理。 这是默认设置。 |
| /s | 搜索当前目录和所有子目录。 |
| /i | 在搜索字符串时忽略字符大小写。 |
| /x | 打印完全匹配的行。 |
| /v | 仅打印不包含匹配项的行。 |
| /n | 打印匹配的每一行的行号。 |
| /m | 如果文件包含匹配项,则仅打印文件名。 |
| /o | 打印每个匹配行之前的字符偏移量。 |
| /p | 跳过包含不可打印字符的文件。 |
| /off[line] | 不跳过设置了脱机属性的文件。 |
/f:<file>
|
从指定文件获取文件列表。 |
/c:<string>
|
使用指定的文本作为文本搜索字符串。 |
/g:<file>
|
从指定文件获取搜索字符串。 |
/d:<dirlist>
|
搜索指定的目录列表。 每个目录都必须用分号 (;) 分隔,例如 dir1;dir2;dir3。 |
/a:<colorattribute>
|
指定具有两个十六进制数字的颜色属性。 键入 color /?,获取其他信息。 |
<strings> |
指定要在 filename 中搜索的文本。 必需。 |
[\<drive>:][<path>]<filename>[...] |
指定要搜索的位置和文件。 至少需要一个文件名。 |
| /? | 在命令提示符下显示帮助。 |
注解
-
所有 findstr 命令行选项都必须位于命令字符串中的 strings 和 filename 之前。
-
正则表达式使用文本字符和元字符查找文本模式,而不是确切的字符串。
-
文本字符是在正则表达式语法中没有特殊含义的字符,它只是匹配该字符的出现。 例如,字母和数字是文本字符。
-
元字符是正则表达式语法中具有特殊含义的符号(运算符或分隔符)。
接受的元字符为:
元字符 值 .通配符 - 任意字符 *重复 - 上一个字符或类的零次或多次出现。 ^起始行位置 - 行的开头。 $结束行位置 - 行的末尾。 [class]字符类 - 集中的任何一个字符。 [^class]逆向类 - 不在集中的任何一个字符。 [x-y]范围 - 指定范围内的任何字符。 \x转义 - 元字符的文本使用。 \<string起始单词位置 - 单词的开头。 string\>结束单词位置 - 单词的结尾。 一起使用时,正则表达式语法中的特殊字符具有最高优先级。 例如,使用通配符 (
.) 和重复字符 (*) 的组合来匹配任何字符串:.*使用以下表达式作为更大的表达式的一部分,以匹配以 b 开头并以 ing结尾的任何字符串:
b.*ing
-
-
若要在一组文件中搜索多个字符串,必须在单独的行中创建包含每个搜索条件的文本文件。
-
除非参数的前缀为 /c,否则使用空格分隔多个搜索字符串。
示例
若要在文件x.y中搜索 "hello" 或 "there",请键入:
findstr hello there x.y
若要在文件 x.y 中搜索 hello there ,请键入:
findstr /c:"hello there" x.y
若要查找文件 proposal.txt 中所有出现的单词 Windows(首字母大写字母 W),请键入:
findstr Windows proposal.txt
要搜索当前目录和所有包含单词 Windows 的子目录中的每个文件,无论字母大小写如何,请键入:
findstr /s /i Windows *.*
要查找所有以 FOR 开头且前面有零个或多个空格的行(如在计算机程序循环中),并显示找到每个出现的行号,请键入:
findstr /b /n /r /c:^ *FOR *.bas
若要在文本文件中列出要搜索的确切文件,请使用文件 stringlist.txt 中的搜索条件,搜索 filelist.txt 中列出的文件,然后将结果存储在文件 results.out 中,键入:
findstr /g:stringlist.txt /f:filelist.txt > results.out
若要列出当前目录和所有子目录中包含单词 computer 的每个文件,无论大小写,请键入:
findstr /s /i /m \<computer\> *.*
若要列出包含单词 computer 和任何其他以 comp 开头的单词的每个文件(例如 compliment 和 compete),请键入:
findstr /s /i /m \<comp.* *.*