cmd命令---find与findstr

转自:

1、DOS命令大全:Find命令详解

2、http://www.jb51.net/article/18987.htm

 

1、find命令

在一个文件或多个文件中搜索指定的文本字符串。当搜索指定的文件后,find 将显示出包含指定字符串的所有行。

语法

复制代码
C:\Users\>find /?
在文件中搜索字符串。

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

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

/? 在命令提示符显示帮助。 如果没有指定路径,FIND 将搜索在提示符处键入的文本或者由另一命令产生的文本。
复制代码

命令注释

  • 指定字符串

    如果不使用 /i,find 将精确搜索指定的字符串。例如,find 命令认为字符“a”和“A”是不同的。但是,如果使用 /i,find 不区分大小写,并将“a”和“A”视为同一个字符。

    如果要搜索的字符串包含引号,必须对包含在字符串中的单引号用双引号引起来,即"StringContaining""QuotationMarks"。

  • 将 find 用作筛选器

    如果省略文件名,find 将用作筛选器,从标准输入源(通常是键盘、管道或重定向的文件)得到输入,然后显示任何包含字符串的所有行。

  • 命令语法次序

    可以按任何顺序键入 find 命令的参数和命令行选项。

  • 使用通配符

    在用 find 命令指定的文件名或扩展名中不能使用通配符(* 和 ?)。要搜索使用通配符指定的一组文件中的字符串,可以在 for 命令中使用 find 命令。

  • 将 /v 或 /n 与 /c 一起使用

    如果在相同的命令行中指定 /c 和 /v ,find 将显示不包含指定字符串的行数。如果在相同的命令行中指定 /c 和 /n,find 将忽略 /n。

  • 在 find中使用回车

    find 命令不能识别回车。当使用 find 在包含回车的文件中搜索文本时,必须将搜索字符串限制在可以在两个回车之间找到的文本,也就是不能被回车中断的字符串。例如,“tax”与“file”之间出现回车时,find 不会报告找到“tax file”字符串。

命令范例

要从Pencil.ad 显示包含字符串“Pencil Sharpener”的所有行,请键入:

find "Pencil Sharpener" pencil.ad

要查找将文字包含在引号之内的字符串,必须首先将整个字符串用引号围绕起来。其次,每个包含在字符串内的引号必须使用双引号。要在 Report.doc中查找“The scientists labeled their paper ‘for discussion only.’It is not a final report.”,请键入:

find "The scientists labeled their paper ""for discussion only."" It is not a final report." report.doc

如果要搜索一组文件,可以使用带有 for 命令的 find 命令。要在当前目录中搜索包含 .bat 扩展名以及包含“PROMPT”字符串的文件,请键入:

for %f in (*.bat) do find "PROMPT" %f

要搜索硬盘以便在 C 驱动器上查找和显示包含字符串“CPU”的文件名,请使用管道号 (|) 将 dir 命令的结果重新定向到如下所示的 find中:

dir c:\ /s /b | find "CPU"

因为 find 搜索区分大小写并且 dir 产生的输出是大写的,所以必须用大写字母键入字符串“CPU”或者将 /i 命令行选项与 find 一起使用。

 

2、findstr命令

使用常规表达式搜索文件中的文本模式。

语法:

复制代码
C:\Users>findstr /?
在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/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"。

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

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。
复制代码

命令注释

  • 在 findstr中使用常规表达式

    Findstr 可以在任何 ASCII 文件或文件中精确查找所要查找的文本。然而,有时要匹配的信息只有一部分或需要查找更宽广的信息范围。在这种情况下,findstr 具有使用常规表达式搜索各种文本的强大功能。

    常规表达式是用于指定文本类型的符号,与精确的字符串相反。标记使用文字字符和元字符。每个在常规的表达式语法中没有特殊意义的字符都是文字字符,与出现的该字符匹配。例如,字母和数字是文字符号。元字符是在常规表达式语法中具有特殊意义(操作符或分隔符)的符号。

    下表列出 findstr 接受的元字符。

    字符
    . 通配符:任何字符
    * 重复:以前字符或类的零次或多次出现
    ^ 行位置:行的开始
    $ 行位置:行的结尾
    [class] 字符类:集合中任何一个字符
    [^class] 反类:不在集合中的任何一个字符
    [x-y 范围:范围:指定范围内的任何字符
    \x 取消:元字符 x 的文字用途
    \<xyz 字位置:字首
    xyz> 字位置:字尾

    常规表达式语法的特殊字符在一起使用时功能最强大。例如,以下匹配任意字符串的通配符 (.) 和重复符 (*) 的组合:

    .*

    将如下表达式用作匹配以“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 /c:"*FOR" *.bas

如果要在相同组文件中搜索几个不同项目,请创建在新行上包含每个搜索标准的文本文件。也可以列出要在文本文件中搜索的确切文件。要使用文件 Finddata.txt中的搜索条件,请搜索 Filelist.txt中列出的文件,然后将结果保存到文件 Results.out中,请键入:

findstr /g:finddata.txt /f:filelist.txt > results.out

假设您想要找到当前目录和所有子目录中每个包含“computer”这个单词的文件,而不考虑字母的大小写。要列出包含单词“computer”的所有文件,请键入:

findstr /s /i /m "\<computer\>" *.*

现在假定不仅需要查找字“computer”,而且需要查找以字母“comp”开头的所有其他字,例如“compliment”和“compete”。请键入:

findstr /s /i /m "\<comp.*" *.*

 

3、find与findstr命令的比较

复制代码
find命令的基本格式是这样的:find "要查找的字符串" 要查找的文件,在这里,"要查找的字符串"这个内容是必不可少的,引号也是必须的。例如:find "bathome" d:\test.txt,表示在D盘根目录下的文本文件test.txt中查找含有 bathome 这一字符串的所有行。 


find的结果将会有两种情况:   
1、当文件中包含要查找的字符串时,将返回这个字符串所在位置的整行内容,具体格式为:第一行是"---------- ×××" (×××表示被查找的文件名,不包括引号对),第二行开始才出现包含字符串的整行内容;   2、当文件中没有出现要查找的字符串时,find的结果仅仅返回"---------- ×××" 这一行内容(×××表示被查找的文件名,不包括引号对)。 在查找指定字符串的时候,有的场合需要区分大小写,有的场合则对大小写并不在意,如何实现这些需求呢?   很简单,在find的时候,添加或取消/i开关就是了,具体用法为:find /i "Abc" test.txt 表示不区分大小写,文本内容中含有 Abc、abc、ABC之类的都算;find "Abc" test.txt则严格区分字符大小写,只能匹配Abc,而不能匹配abc、ABC之类的字符。   有时候,我们的需求并不是为了查找到某个字符串,而是要检测哪些行不含有特定的字符串,这个时候,可以使用开关/v,用法为:find /v "Abc" test.txt,它表示查找那些不含字符串Abc的行(Abc要区分大小写),如果不区分abc的大小写,那么,应该写成 find /i /v "Abc" test.txt。   有时候,我们的要求很简单,仅仅只是想统计包含某个字符串的行总共有多少,这个时候,应该使用开关/c,写成 find /c "abc" test.txt。   如果要在每行的行首显示行号,怎么办?那就写成 find /n "abc" test.txt 吧,它会把test.txt的内容都显示出来,与原文不一样的是,在每行内容的行首,都加上了行号——注意,它仅仅是在显示的时候加上行号而已,并没有真正改写文件的内容。   如果你看到这样的命令:find /i /v /n "Abc" test.txt,请一点要先沉住气,不要被众多的开关弄得眼花缭乱吓趴下了,仔细对照上面的解释,相信你很快就会理解它的功能:在test.txt文件中,查找不包含字符串Abc的所有行,并在行首标上这些行的行号,查找的时候,字符串Abc不区分大小写。   要是使用这样的语句:find /c /n "abc" test.txt,会出现什么样的结果呢?答案是:开关/n会被忽略掉,最终结果不会显示带行号的行内容,只会显示匹配的总行数而已。   echo abcdef|find "abc",见过这种写法吗?它的含义是:在字符串abcdef中,检测是否存在字符串abc,也就是说,find支持管道符号,把管道符号之前的语句的执行结果,作为指定字符串的查找对象,甚至,你可以使用这样的语句:find "abc" test.txt|find "xyz",它表示在test.txt中查找同时存在字符串abc和字符串xyz的行,只要你愿意,你可以继续用管道符号把这个find语句连接下去,我们把这个过程称为多重过滤。   在前面,我们说过,在 find "要查找的字符串" 要查找的文件 这条命令语句中,引号是必须的,要是我们要查找的内容就是双引号本身,那又该怎么办?   答案很简单:把双引号本身先用双引号转义,再放到双引号对中,写成 find """" test.txt 的格式,如果要查找两个连续的双引号,则应该写成 find """""" test.txt。   如果你想查找两行之间的字符块,我劝你趁早放弃这个疯狂的想法,因为,find仅仅针对位于同一行上的字符串,不能查找跨行的字符块。   
与findstr命令相比,find的功能确实有限得多,仅仅因为不支持正则表达式这一点。   然而,find并非一无是处,凭借自己的独门绝技,在与findstr的竞争中,它挣得了一席之地。   这些独门绝技是什么呢?   
1统计含指定字符串的总行数。find /c "abc" test.txt可以统计test.txt中含有字符串abc的总行数,而findstr则没有直接提供该功能,需要配合for语句才能实现;   2find可以读取Unicode格式的文本,而findstr则不行;   3find可以过滤某些特殊字符,而findstr则不行,比如,我们在使用fsutil fsinfo drives语句查询磁盘分区的时候,如果想让盘符分行显示而不是显示在同一行上的时候(这在用for语句提取盘符的时候很有用),find可以大显身手,而findstr只能干瞪眼了,具体语句为:fsutil fsinfo drives|find /v ""
复制代码

 

posted @   milkty  阅读(15787)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示