Board logo

标题: [系统相关] 批处理findstr命令用法咨询 [打印本页]

作者: weichenxiehou    时间: 2011-2-22 11:46     标题: 批处理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 编辑 ]
作者: 随风    时间: 2011-2-22 12:14

findstr /m "123" *.txt 这样作用就大了吧 ^_^      /s 也是同理
其他的就不清楚了,用的时候不多,等其他高手解答吧   由其那个 l和r  都是现用现套。
作者: weichenxiehou    时间: 2011-2-22 12:21     标题: 回复 2楼 的帖子

谢谢随风前辈教导,又懂两个开关了。findstr /m /s "123" *.txt的意思就是说把当前目录和所有子目录下中含有"123"字符串的文本文件名打印出来?谢谢!
作者: hanyeguxing    时间: 2011-2-22 13:04

/a 时后面必须通配文件
/f 指定搜索的文件范围
/d 就是指定查询的目录
例如:findstr /a:89 /d:批处理 1 *.txt

[ 本帖最后由 hanyeguxing 于 2011-2-22 13:43 编辑 ]
作者: wc726842270    时间: 2011-2-22 13:49

  1. findstr /a:1f .* 2.txt?
  2. findstr /a:1f .* 4*
复制代码
最后一个是通配符即可
作者: cjiabing    时间: 2011-2-22 14:02

虽然用Findstr用得多,但不熟悉,经常要看帮助,其实大大们(如随风)用FINDSTR更加娴熟,下面就我知道的谈谈他们的作用。
findstr的用法,一个用于对文本内容的搜索(以行为基础),一个用于对文件的搜索。当然还有其它衍生的功能,注意区分。
  1. /B        在一行的开始配对模式。——只在行开头搜索。
  2. /E        在一行的结尾配对模式。——只在行结尾搜索。
  3. /L        按字使用搜索字符串。——具体不详,可以与 /r 参数替换测试。
  4. /R        将搜索字符串作为一般表达式使用。——当命令成功而搜索失败时(某些中文字符搜索,类似 /I 参数),可以试试这个参数。
  5. /S        在当前目录和所有子目录中搜索匹配文件。——这个没啥说的,搜索程序所在目录内的所有位置。
  6. /I         指定搜索不分大小写。——搜索英文时注意。
  7. /X        打印完全匹配的行。——只有搜索到的行与搜索词一致时显示结果。
  8. /V        只打印不包含匹配的行。——与 /X 参数相反,如果行中没包含搜索词就显示。
  9. /N        在匹配的每行前打印行数。——这个可以用来获得一个文本由多少行,并可以与FOR、if等组合定位行。
  10. /M        如果文件含有匹配项,只打印其文件名。——用于搜索文件,搜索到含有关键词的文件时,就显示文件名。
  11. /O        在每个匹配行前打印字符偏移量。——没用过,偏移量应该和SET的截取差不多吧,大大们解释下。
  12. /P        忽略有不可打印字符的文件。——我很少用。
  13. /OFF[LINE] 不跳过带有脱机属性集的文件。。——我很少用。
  14. /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"——搜索到文件时用色彩显示出来,很有用。
  15. /F:file   从指定文件读文件列表 (/ 代表控制台)。——应该是与  /G:file 参数相对,也就是从文本中搜索字符时,该文本可以预先写入一个文本中,然后类似FOR的读取。似乎是这样。
  16. /C:string 使用指定字符串作为文字搜索字符串。——我很少用。
  17. /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。——FIndstr可以将搜索关键词写入到一个文本中,然后一次性的用该文本获取关键词进行搜索,类似FOR。
  18. /D:dir    查找以分号为分隔符的目录列表。——使用findstr /n的结果会以分号分隔,此时该命令应该起作用,没用过。
复制代码

[ 本帖最后由 cjiabing 于 2011-2-22 14:06 编辑 ]




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2