查找文件中出现的字符串并通过批处理文件显示“文件名 - 计数”

Posted

技术标签:

【中文标题】查找文件中出现的字符串并通过批处理文件显示“文件名 - 计数”【英文标题】:Find occurrences of a string in files and display "filename - count" through batch file 【发布时间】:2015-10-10 22:25:45 【问题描述】:

批处理文件搜索目录中的每个子文件夹和每个文件,并计算特定字符串在每个文件中出现的次数。

如果输出是“文件名 - 计数”会很有用。

可以找到 /c "Microsoft" *.txt 如果所有文件都在一个文件夹中,则此方法有效。

如何使查找循环遍历所有子文件夹及其每个文件并显示相同的结果。

Findstr 有 /s 可以做到这一点,在 find 上不起作用。

【问题讨论】:

完整路径(以C:\... 开头)适合您吗? 是的,斯蒂芬,事实上那将是完美的。 请注意 - FIND /C 报告包含搜索字符串的的数量,不是的数量发生。 【参考方案1】:

从命令行:

for /F "delims=" %G in ('findstr /I /S /M "Microsoft" "%CD%\*.txt"') do @find /I /C "Microsoft" "%~G" | findstr /V /R "^$"

来自批处理脚本:

set "_srch=Microsoft"
for /F "delims=" %%G in ('
       findstr /I /S /M "%_srch%" "%CD%\*.txt"') do (
    find /I /C "%_srch%" "%%~G" | findstr /V /R "^$"
)

省略%CD%\,您将获得相对路径。

find 输出(命令行)中删除----------

for /F "delims=" %G in ('findstr /I /S /M "Microsoft" "%CD%\*.txt"') do @for /F "tokens=1,*" %H in ('find /I /C "Microsoft" "%~G"') do @echo %I

资源:输入for /?find /?findstr /?set /? 或转到An A-Z Index of the Windows CMD command line。

【讨论】:

此方法计数,而不是字符串。如果有一行字符串出现多次,则计为一次。【参考方案2】:

没有使用 FIND /C 的解决方案报告搜索字符串的出现次数 - 而是报告包含至少一次搜索字符串出现的行数。

如果你真的想计算出现次数,包括在一行中出现多次的可能性,那么一种解决方案是使用JREPL.BAT - 纯脚本(混合 JScript/批处理)文本处理命令行从 XP 开始在任何 Windows 机器上运行的实用程序。

@echo off
setlocal
for /r %%F in (*.txt) do (
  set "file=  %%F"
  jrepl "Microsoft" "cnt+=1; false" /l /jmatch /jbeg "cnt=0" /jend "output.WriteLine(lpad(cnt,'         ')+env('file'))" /f "%%F"
)

上面生成了格式良好且对齐的报告,左侧填充计数,后跟文件名的完整路径。我使用/L 选项进行文字搜索。我定义并使用了file 变量,以防您遇到包含' 的文件名。如果我改为传递字符串文字,则所有 ' 都必须加倍。

如果你想抑制计数为 0 的文件,那么你可以简单地添加一个 if 语句:

@echo off
setlocal
for /r %%F in (*.txt) do (
  set "file=  %%F"
  jrepl "Microsoft" "cnt+=1; false" /l /jmatch /jbeg "cnt=0" /jend "if (cnt) output.WriteLine(lpad(cnt,'         ')+env('file'))" /f "%%F"
)

使用 JREPL 的好处在于您可以轻松删除 /L 选项并切换到使用正则表达式,并且非常具体地说明您要搜索的字符串。

【讨论】:

【参考方案3】:
for /R %%i in (*.txt) do find /c "Microsoft" "%%i"

如果要抑制计数为 0 的文件,只需添加 |findstr /v " 0$"

摆脱----------:

for /f "tokens=1,*" %%a in ('for /R %%i in (*.txt^) do find /c "Microsoft" "%%i"^|findstr /v " 0$"') do echo %%b

(如果要包含 count=0 的文件,请删除 ^|finstr /v " 0$"

这比 JosefZ 的答案快 30%。

【讨论】:

以上是关于查找文件中出现的字符串并通过批处理文件显示“文件名 - 计数”的主要内容,如果未能解决你的问题,请参考以下文章

linux常用命令

Windows BAT:查找多个文件中出现的字符串

.NET 图像处理程序在下载时剥离文件类型

linux下如何批量删除文件名的某个字符串

我想在linux下查找当前目录下名为Bin的文件夹并直接zip,命令怎么写

perl模糊匹配文件名