[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] 批处理findstr命令用法咨询

在论坛潜水快两个月了,学到不少东西,谢谢各位前辈的无私奉献。
关于findstr命令,通过看帖,看前辈代码,最基本的几个开关(/b /e /i /x /v /n /o /c /g)我基本知道怎么用了,但是看到其他几个开关(/l /r /s /m /d /f /a)还是有点儿犯迷糊,可能是平时用得少的缘故,在下有点儿强迫症,想学一个命令就学全一点儿,望前辈指教,拉菜鸟一把,在此先谢谢了。
/l和/r两个开关应该是对搜索字符串的处理方法,但是我不懂什么是"按字使用"和"按一般表达式适用"。
/s帮助文件的解释是"在当前目录和所有子目录中搜索匹配文件",什么意思呢?不懂啊。
/m基本上懂是什么意思,findstr /m "123" test.txt如果test.txt中有字符串"123"就打印文件名"test.txt",如果没有就不打印,但有什么用呢?
/f 从指定文件读文件列表,不知道咋用,望指教。
/d"查找以分号为分隔符的目录列表",不知是什么意思。
/a:attr 我用findstr /a:89 .* test.txt测试可颜色并没变啊?怎么回事呢?
欢迎各位老手新手的热心解答,在此代表菜鸟们谢谢各位前辈!如果附上例子解释,在下感激不尽。

多谢 寒夜孤星 和 枫中残雪 两位前辈的热心提示,在看了一些彩色显示代码算把/a这个开关弄清楚了,谢谢!

十分感谢 甲兵时代 的热心而全面的解答,有些没明白的地方也明白了!现在就剩/l和/r两个开关了,不过收获不小。

那么为了帮助像我一样的菜鸟学习findstr命令,我就把各个开关的用法简要说下,也算是为了达到开贴为论坛服务的目的吧!
/b和/e:开始配对模式和末尾配对模式,也就是说要搜索的字符串必须在行首和行尾才算符合要求,跟正则表达式中的^和$功能相仿(请参见http://www.bathome.net/viewthread.php?tid=24&highlight=findstr%D5%FD%D4%F2%B1%ED%B4%EF%CA%BD),如
  1. findstr /b "test" test.txt
复制代码
会搜索出test123这一行,而不会搜索出123test这一行,/e与此类似。
/l和/r:望高手补充
/s:在当前目录和所有子目录中搜索匹配文件,与通配符搭配功能强大,如
  1. findstr /s "test" *.txt
复制代码
会搜索当前目录和其所有子目录下的文本文件,打印出含有字符串"test“的所有行,打印结果前会有文件路径和文件名,形如:
  1. test\test.txt:test123
  2. test\test.txt:123test
复制代码
/i:指定搜索不分大小写,搜索字符串是不分大小写的,如:
  1. findstr /i "abc" test.txt
复制代码
文本中像"123ABC"这样的行也会被列出。
/x:打印完全匹配的行,就是该行必须只含有搜索字符串才能匹配,"跟正则表达式的"^字符串$"功能类似,如:
  1. findstr /x "test" test.txt
复制代码
会打印"test“这行,而不会打印"test123”这行。
/v:只打印不包含匹配的行,很好理解,就是含有搜索字符串的行不打印,不含有搜索字符串的行打印,如:
  1. findstr /v "123" test.txt
复制代码
所有不包含字符串"123"的行都会被打印出来。跟正则表达式中的^作用类似。
/n:在匹配的每行前打印行数,看看执行结果就知道什么意思了:
  1. findstr /n "test" test.txt
复制代码
执行结果为:
  1. 1:test123
  2. 2:123test
复制代码
也就是在找到的每行前加上行号(该行在该文件中位于哪行),用冒号分隔。
/o:在每行前打印字符偏移量,在找到的每行前打印该行首距离文件开头的位置,也就是多少个字符,如test.txt中有如下内容:
  1. aaaaaaaaaa
  2. aaaaaaaaaa
  3. aaaaaaaaaa
  4. aaaaaaaaaa
  5. aaaaaaaaaa
  6. aaaaaaaaaa
复制代码
执行命令:
  1. findstr /0 .* test.txt
  2. ::上一行中的.*为正则表达式的内容,表示任意行,包含空行
复制代码
结果如下:
  1. 0:aaaaaaaaaa
  2. 12:aaaaaaaaaa
  3. 24:aaaaaaaaaa
  4. 36:aaaaaaaaaa
  5. 48:aaaaaaaaaa
复制代码
注意每行末尾的回车换行符算两个字符。
/a:当被搜索文件名中含有通配符*或?时对搜索结果的文件名部分指定颜色属性,具体颜色值参见color帮助:
0 = 黑色       8 = 灰色
1 = 蓝色       9 = 淡蓝色
2 = 绿色       A = 淡绿色
3 = 浅绿色     B = 淡浅绿色
4 = 红色       C = 淡红色
5 = 紫色       D = 淡紫色
6 = 黄色       E = 淡黄色
7 = 白色       F = 亮白色
常用于彩色显示,举个简单的例子,想要彩色显示“批处理之家”怎么办,假如当前的color设置为27(背景绿色,字体白色),用蓝色显示“批处理之家”咋办?
  1. ::下一行的退格符可以在cmd的编辑模式下按ctrl+p后按退格键获得
  2. >"批处理之家" set /p=<nul
  3. findstr /a:21 .* "批处理之家*"
  4. pause
复制代码
代码中的退格符是为了让显示的内容仅为"批处理之家",如果有其他内容,在彩色显示的"批处理之家"后还有一个冒号和其他内容,退格符正好将冒号删除。注意代码中的通配符是必须的。
/f:从指定文件读文件列表,事先可以将待搜索的文件放在一个文本文件中,每个文件放在一行,findstr命令在执行时会到文本文件中去找这些待搜索的文件,假如当前目录下有一文本文件list.txt中内容如下:
  1. 1.txt
  2. 2.txt
  3. 3.txt
  4. 4.txt
  5. 5.txt
  6. 6.txt
  7. 7.txt
  8. 8.txt
  9. 9.txt
复制代码
且当前目录下有这些文件,文件内容都是123456789,那么执行下列命令:
  1. findstr /f:list.txt "1"
复制代码
结果如下:
  1. 1.txt:123456789
  2. 2.txt:123456789
  3. 3.txt:123456789
  4. 4.txt:123456789
  5. 5.txt:123456789
  6. 6.txt:123456789
  7. 7.txt:123456789
  8. 8.txt:123456789
  9. 9.txt:123456789
复制代码
看了这个例子相信你也明白了这个开关的作用。
/m:如果文件含有匹配项,只打印其文件名,而且还会打印路径,意思很好理解,如:
  1. findstr /s /m "123" *.txt
复制代码
会找出当前目录和其所有子目录中含有字符串"123"的文本文件,结果:
  1. test\1.txt
  2. test\2.txt
  3. test\3.txt
  4. test\4.txt
  5. test\5.txt
  6. test\6.txt
  7. test\7.txt
  8. test\8.txt
  9. test\9.txt
复制代码
/c:使用指定字符串作为文字搜索字符串,如要搜索字符串"123 456",通常我们会想到
  1. findstr "123 456" test.txt
复制代码
但是这样搜索字符串会被当成两个字符串,只含有"123"或"456"的行也会被打印出来,此时就可以用
  1. findstr /c:"123 456" test.txt
复制代码
这是搜索字符串为"123 456"了。
/g:从指定的文件获得搜索字符串,也就是事先把搜索字符串放在一个文本文件中,findstr执行时到这个文件中去找这个搜索字符串,如1.txt中内容为"123“,执行命令
  1. findstr /g:1.txt test.txt
复制代码
等同于findstr "123" test.txt。1.txt中可以有多行,表示有多个搜索字符串。
/d:查找以分号为分隔符的目录列表,就是到这个开关所指定的目录中去搜索指定文件,如有11和22两个文件夹在当前目录下,执行命令:
  1. findstr /d:11;22 "12" *.txt
复制代码
结果如下:
  1.   11:
  2. 1.txt:123
  3. 2.txt:123456789
  4. 3.txt:123456789
  5. 4.txt:123456789
  6. 5.txt:123456789
  7.   22:
  8. 6.txt:123456789
  9. 7.txt:123456789
  10. 8.txt:123456789
  11. 9.txt:123456789
复制代码
以上内容希望可以帮到对findstr命令不熟的朋友们,最后祝福我等菜鸟在批处理之家能够快乐地得到提高!

[ 本帖最后由 weichenxiehou 于 2011-2-22 17:17 编辑 ]
1

评分人数

看得多说得多,远比不上写得多。

回复 2楼 的帖子

谢谢随风前辈教导,又懂两个开关了。findstr /m /s "123" *.txt的意思就是说把当前目录和所有子目录下中含有"123"字符串的文本文件名打印出来?谢谢!
看得多说得多,远比不上写得多。

TOP

返回列表