linux中的grep等同于win中的findstr命令。可以在txt文本中截取到有特定关键字的行,并显示出来。
grep也可以通过关键字,在一个文件夹下查找多个有这些关键字的文件,并生成结果。
一、findstr命令介绍
findstr是Windows系统自带的命令,简单来说,就是根据一定的格式来查找文件中指定的行,并打印相关信息。
findstr 算是find的扩展,功能更强大,关键是还支持正则表达式。
查看下findstr命令的帮助信息
语法格式
简单格式:findstr [可选参数] 要查找的字符串 [路径\文件名]
详细格式:findstr [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file] [/C:string] [/G: file] [/D:dirlist] [/A:colorattributes] [strings] [ [drive:] [path] filename [ ... ] ]
注意点:
1.默认是查找当前目录,至少指定一个文件,当然可以同时指定多个,用空格分隔。
2.文件名可以使用通配符,例如所有文本文件,就可以写成 *.txt 。
3.详细参数列表
参数 参数说明
/B 在一行的开始配对模式。
/E 在一行的结尾配对模式。
/L 按字使用搜索字符串。
/R 将搜索字符串作为一般表达式使用。
/S 在当前目录和所有子目录中搜索匹配文件。递归查找
/I 指定搜索不分大小写。忽略大小写
/X 打印完全匹配的行。输出和搜索文本完全匹配的行
/V 只打印不包含匹配的行。匹配结果反选,只输出不包含搜索文本的行。
/N 在匹配的每行前打印行数。行号从1开始计数,即:第一行的行号是1
/M 如果文件含有匹配项,只打印其文件名。
/O 在每个匹配行前打印字符偏移量。即匹配内容的首字符在filename整个文件中出现的的字符偏移量,字符偏移量从0开始计数。
/P 忽略有不可打印字符的文件。
/OFF[LINE] 不跳过带有脱机属性集的文件。
/A:attr 指定有十六进位数字的颜色属性。请见 “color /?”
/F:file 从指定文件读文件列表 (/ 代表控制台)。
/C:string 使用指定字符串作为文字搜索字符串。查找包含空格的字符串所在行
/G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。
/D:dir 查找以分号为分隔符的目录列表
strings 要查找的文字。
[drive:][path]filename 指定要查找的文件。
二、例子
使用的两个测试文件:
Test1.txt:
hello world
hello world boy
hello world girl
the world is over
Test2.txt:
hello world
hello world boy
hello world girl
the world is broken
1. 指定一个字符串和一个文件,打印找到的行(基本使用、单字符串搜索)
findstr "hello" D:\Test1.txt
得到的结果:
hello world
hello world boy
hello world girl
跟find命令差不多。表示在D盘下的test.txt文件中查找含有 hello这一字符串的所有行。
2、指定多个字符串和一个文件,打印找到的行(多字符串搜索)
findstr "hello world" D:\Test1.txt
得到的结果:
hello world
hello world boy
hello world girl
the world is over
表示查找含有字母 hello 或 world 的行。
这里需要注意,多个字符串通过空格区分,且都需要在""之内,如果这里没有"",第二个字符串(就是这里的world)会被当成文件名。
还有一点值得关注,即同一行只会打印一次,即使包含多个字符串。
3、指定多个字符串和多个文件,打印找到的行
findstr "hello world" D:\Test1.txt D:\Test2.txt
得到的结果:
Test1.txt:hello world
Test1.txt:hello world boy
Test1.txt:hello world girl
Test1.txt:the world is overTest2.txt:hello world
Test2.txt:hello world boy
Test2.txt:hello world girl
Test2.txt:the world is broken
所有包含hello和world的语句都被打印出来了,且在每一行的开头打印都会指定对应的文件。
4、将"hello world"作为一个整体来查找(查找带有空格的字符串)
findstr /C:"hello world" D:\Test1.txt
得到的结果:
hello world
hello world boy
hello world girl
与2相比,此处不再打印单独匹配world的行。
/C用于指定某个字符串,空格不再作为字符串的分隔符,而是作为字符串本身的一部分。如果不用参数/c:findstr "hello world" D:\Test1.txt 就会输出含有字母 hello 或 world 的行。
5、只打印文件中完全匹配字符串的行
findstr /C:"hello world" /X D:\Test1.txt
得到的结果:
hello world
/X用来指定全字符串匹配的行,所以后面接了boy/girl的行都不算。
6、只打印不匹配的行
findstr /C:"hello world" /X /V D:\Test1.txt
得到的结果:
hello world boy
hello world girl
the world is over
/V之后不再打印匹配的行,而是相反。
7、findstr中的字符串支持正则表达式,可以使用/R来指定,此时字符串编程正则表达式。
findstr /R "world$" D:\Test1.txt
得到的结果:
hello world
这里的/R指定了正则表达式,而该表达式里面的$表示文件结尾,所以之类的意思就是找到文件结尾是world的字符串。
8、在当前目录及所有子目录下的所有文件中查找
findstr /s /i "hello" *.*
在当前目录及所有子目录下(/s)的所有文件中查找"hello"这个字符串,*.* 表示所有类型的文件,同时不区分字符串的大小写(/i)。
9、正则表达式的使用
匹配纯字母的行,写法如下:
findstr /R "^[a-z]*$" D:\Test1.txt
匹配hello开头的行,写法如下:
findstr /R "^hello" D:\Test1.txt