findstr 是一个功能非常强大的命令行工具,用于在文件中搜索字符串,你可以把它想象成命令行版的“查找”功能,但它比 find 命令更强大、更灵活。

基本语法
FINDSTR [/options] [/C:string] [/G:file] [/M] [/O] [/P] [/S] [/I] [/X] [/V] [/N] [/OFF[LINE]] [[drive:][path]filename[...]]
看起来很复杂,别担心,我们不会一次性讲完,我们先从最核心的部分开始。
最简单的用法
在单个文件中搜索字符串
这是 findstr 最基本的功能,语法是 findstr "要搜索的字符串" 文件名。
示例:
在 config.txt 文件中搜索字符串 "error"。
findstr "error" config.txt
注意:

- 搜索的字符串通常需要用双引号 括起来,特别是当字符串中包含空格时。
- 默认情况下,
findstr是区分大小写的,搜索 "Error" 和 "error" 会得到不同的结果。
在多个文件中搜索字符串
你可以同时搜索多个文件,甚至使用通配符 和 。
示例:
在当前目录下所有 .log 文件中搜索 "warning"。
findstr "warning" *.log
示例:
在 C:\Logs 目录及其所有子目录中搜索 "failed"。
findstr /S "failed" C:\Logs\*
/S参数表示搜索当前目录及其所有子目录。
常用参数详解
参数让 findstr 强大起来,下面是最常用的一些参数:

/I:不区分大小写
这是最常用的参数之一,可以让搜索变得不区分大小写。
示例: 无论 "Error"、"ERROR" 还是 "error",只要包含这个单词都会被找到。
findstr /I "error" *.log
/N:显示行号
这个参数会在输出的每一行前面加上它在文件中的行号,非常方便定位问题。
示例:
搜索 config.txt 中的 "error" 并显示行号。
findstr /N "error" config.txt
输出可能如下:
15:This is a critical error message.
42:An error occurred while loading the file.
/C:string:将 string 作为文字字符串搜索
默认情况下,findstr 会把空格分隔的多个词视为“或”的关系。findstr "error warning" file.txt 会搜索包含 "error" 或者 "warning" 的行。
如果你想搜索一个包含空格的完整短语,就需要使用 /C: 参数。
示例: 搜索包含 "file not found" 这个完整短语的行,而不是搜索包含 "file" 或者 "not" 或者 "found" 的行。
findstr /C:"file not found" application.log
/R:使用正则表达式
这是 findstr 的王牌功能,它支持强大的正则表达式来进行模式匹配。
示例: 查找所有以 "error" 开头,后面跟着一个冒号和数字的行("error: 404", "error: 500")。
findstr /R "^error:[0-9]" debug.log
^表示行的开头。[0-9]表示匹配任意一个数字。
常用正则表达式元字符:
- : 匹配任意单个字符。
- : 匹配前一个字符零次或多次。
^: 匹配行的开头。- : 匹配行的结尾。
[class]: 匹配字符类中的任何字符,[a-z]匹配任意小写字母。[^class]: 匹配不在字符类中的任何字符。\x: 匹配十六进制字符x。
/V:输出不包含匹配项的行
这个参数会反转搜索结果,只显示不包含指定字符串的行。
示例:
显示 config.txt 中所有不包含 "disabled" 的行。
findstr /V "disabled" config.txt
/M:只输出包含匹配项的文件名
如果你不关心具体是哪一行,只想知道哪些文件包含了你要找的内容,这个参数非常有用。
示例: 查找当前目录及其子目录中所有包含 "password" 的文件,并只列出文件名。
findstr /S /M "password" *
/B 和 /E:匹配行首或行尾
/B:只匹配行首的字符串。/E:只匹配行尾的字符串。
示例: 只查找以 开头的注释行。
findstr /B "^#" settings.ini
/G:file:从文件中获取搜索模式
你可以把要搜索的字符串列表写在一个文本文件里(每行一个),然后使用 /G: 参数让 findstr 从这个文件中读取搜索模式。
示例:
假设你有一个文件 keywords.txt如下:
error
warning
critical
你可以用下面的命令在 system.log 中搜索所有这些关键词。
findstr /G:keywords.txt system.log
综合实例
场景: 你需要排查一个网站的问题,怀疑是权限或配置文件的问题,你有一个 C:\inetpub\logs\LogFiles 目录,里面有很多日志文件。
-
在所有日志文件中搜索 "error" 或 "failed",不区分大小写,并显示行号。
findstr /I /N /S "error failed" C:\inetpub\logs\LogFiles\*
-
查找所有访问被拒绝(401 或 403)的记录。
findstr /R " 40[13]" C:\inetpub\logs\LogFiles\*
- 注意
40[13]前面的空格,这可以避免匹配到像 "1401" 这样的数字。
- 注意
-
找出所有配置文件(
.config)中,没有被注释掉的connectionString行。- 找出所有包含
connectionString的行(不管是否被注释):findstr /N "connectionString" *.config
- 找出所有不以
<!--开头的行(即非注释行):findstr /V /B "^<!--" *.config
- 将两者结合比较复杂,通常需要先找到包含关键字的行,再过滤掉注释行,或者更简单的方法是使用
/G:参数。
- 找出所有包含
与 find 命令的区别
很多老用户会混淆 find 和 findstr。
| 特性 | find |
findstr |
|---|---|---|
| 功能 | 基础字符串搜索 | 高级字符串搜索 |
| 正则表达式 | 不支持 | 支持 (/R) |
| 不区分大小写 | /I 参数 |
/I 参数 |
| 行号显示 | /N 参数 |
/N 参数 |
| 搜索文件列表 | 不支持 | 支持 (/G:file) |
| 通配符 | 不支持 | 支持 (/S 搜索子目录) |
| 反向查找 | 不支持 | 支持 (/V) |
| 搜索短语 | 自动将空格视为短语的一部分 | 需要使用 /C: 参数 |
除非你有特殊需求,否则请始终使用 findstr,它的功能远比 find 强大,是现代 Windows 系统中搜索文本事实上的标准工具。
