菜鸟科技网

dos findstr命令

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

dos findstr命令-图1
(图片来源网络,侵删)

基本语法

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

注意:

dos findstr命令-图2
(图片来源网络,侵删)
  • 搜索的字符串通常需要用双引号 括起来,特别是当字符串中包含空格时。
  • 默认情况下,findstr区分大小写的,搜索 "Error" 和 "error" 会得到不同的结果。

在多个文件中搜索字符串

你可以同时搜索多个文件,甚至使用通配符 和 。

示例: 在当前目录下所有 .log 文件中搜索 "warning"。

findstr "warning" *.log

示例:C:\Logs 目录及其所有子目录中搜索 "failed"。

findstr /S "failed" C:\Logs\*
  • /S 参数表示搜索当前目录及其所有子目录。

常用参数详解

参数让 findstr 强大起来,下面是最常用的一些参数:

dos findstr命令-图3
(图片来源网络,侵删)

/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 目录,里面有很多日志文件。

  1. 在所有日志文件中搜索 "error" 或 "failed",不区分大小写,并显示行号。

    findstr /I /N /S "error failed" C:\inetpub\logs\LogFiles\*
  2. 查找所有访问被拒绝(401 或 403)的记录。

    findstr /R " 40[13]" C:\inetpub\logs\LogFiles\*
    • 注意 40[13] 前面的空格,这可以避免匹配到像 "1401" 这样的数字。
  3. 找出所有配置文件(.config)中,没有被注释掉的 connectionString 行。

    • 找出所有包含 connectionString 的行(不管是否被注释):
      findstr /N "connectionString" *.config
    • 找出所有不以 <!-- 开头的行(即非注释行):
      findstr /V /B "^<!--" *.config
    • 将两者结合比较复杂,通常需要先找到包含关键字的行,再过滤掉注释行,或者更简单的方法是使用 /G: 参数。

find 命令的区别

很多老用户会混淆 findfindstr

特性 find findstr
功能 基础字符串搜索 高级字符串搜索
正则表达式 不支持 支持 (/R)
不区分大小写 /I 参数 /I 参数
行号显示 /N 参数 /N 参数
搜索文件列表 不支持 支持 (/G:file)
通配符 不支持 支持 (/S 搜索子目录)
反向查找 不支持 支持 (/V)
搜索短语 自动将空格视为短语的一部分 需要使用 /C: 参数

除非你有特殊需求,否则请始终使用 findstr,它的功能远比 find 强大,是现代 Windows 系统中搜索文本事实上的标准工具。

分享:
扫描分享到社交APP
上一篇
下一篇