如何使用windows命令行查找文件中字符串的出现次数?

如何使用windows命令行查找文件中字符串的出现次数?,windows,string,file,command-line,find,Windows,String,File,Command Line,Find,我有一个带有电子邮件地址的巨大文件,我想计算一下这个文件中有多少文件。如何使用Windows的命令行执行此操作 我试过了,但它只打印出匹配的线条。(顺便说一句:所有电子邮件都包含在一行中) findstr/c:“@”mail.txt使用您拥有的,您可以通过查找管道将结果传递给。我经常看到这样的东西被使用 findstr /c:"@" mail.txt | find /c /v "GarbageStringDefNotInYourResults" 因此,您正在计算findstr命令中没有垃圾字符

我有一个带有电子邮件地址的巨大文件,我想计算一下这个文件中有多少文件。如何使用Windows的命令行执行此操作

我试过了,但它只打印出匹配的线条。(顺便说一句:所有电子邮件都包含在一行中)


findstr/c:“@”mail.txt

使用您拥有的,您可以通过
查找管道将结果传递给
。我经常看到这样的东西被使用

findstr /c:"@" mail.txt | find /c /v "GarbageStringDefNotInYourResults"

因此,您正在计算
findstr
命令中没有垃圾字符串的行数。有点像黑客,但它可能对你有用。或者,只需在您关心的字符串上使用
find/c
。最后,您提到了每行一个地址,因此在本例中,上述方法有效,但每行有多个地址,这会中断。

我在网上发现了这一点。看看它是否有效:

findstr /R /N "^.*certainString.*$" file.txt | find /c "@"

我会在您的系统上安装unix工具(在任何情况下都很方便:-),然后它就非常简单了-请看,例如:

(使用awk:

awk '$1 ~ /title/ {++c} END {print c}' FS=: myFile.txt
)

您可以在此处获得Windows unix工具:


我就是这样做的,在FINDSTR中使用AND条件(计算日志文件中的错误数):


注意:这计算的是“包含字符串匹配的行数”,而不是“文件中的总出现次数”。

可能有点晚了,但下面的脚本对我有效(源文件包含引号字符,这就是我使用“usebackq”参数的原因)。 插入符号(^)在windows批处理脚本语言中充当转义字符

@setlocal enableextensions enabledelayedexpansion    
SET TOTAL=0
FOR /F "usebackq tokens=*" %%I IN (file.txt) do (
    SET LN=%%I
    FOR %%J IN ("!LN!") do (
        FOR /F %%K IN ('ECHO %%J ^| FIND /I /C "searchPhrase"') DO (
            @SET /A TOTAL=!TOTAL!+%%K
        )
    )
)
ECHO Number of occurences is !TOTAL!
非常简单的解决方案:

grep -o "@" mail.txt | grep -c .
记住一行末尾的一个点

以下是一种更容易理解的方式:

grep -o "@" mail.txt | grep -c "@"
第一个grep只选择“@”字符串,并将每个字符串放在新行上

第二个grep计算行数(或带@的行数)

grep实用程序可以从站点或从站点安装。它是非常小和安全的文本过滤器。grep是最有用的Unix/Linux命令之一,我每天都在Linux和Windows中使用它。 Windowsfindstr很好,但没有grep等功能

如果您喜欢CLI或批处理脚本,在Windows中安装grep将是最好的选择之一。

为什么不简单地使用它(这决定了包含(至少)一个
@
字符的行数):

示例输出:


要避免输出中的文件名,请将其更改为:

find /C "@" < "mail.txt"

要捕获结果编号并将其存储在变量中,请使用以下命令(将批处理文件中的
%N
更改为
%N
):

设置“NUM=0”
对于('find/C“@”^<“mail.txt”')中的/F%N,请设置“NUM=%N”
回显%NUM%
使用以下方法:

type file.txt | find /i "@" /c

好吧,去餐桌的时间太晚了,但是。。。许多受访者似乎没有遵守原来的规范,即所有电子邮件地址都出现在一行上。这意味着,除非每次出现@符号时都引入CRLF,否则使用FINDSTR/c变体的建议不会有帮助

在用于DOS的Unix工具中,有非常强大的SED.exe。谷歌。这是摇滚乐。这里有一个建议:

find "@" datafile.txt | find "@" | sed "s/@/@\n/g" | find /n "@" | SED "s/\[\(.*\)\].*/Set \/a NumFound=\1/">CountChars.bat
说明:(假设包含数据的文件名为“Datafile.txt”) 1) 第一个查找包含3行标题信息,这会抛出一个行计数方法,因此将结果通过管道传输到第二个(相同)查找以去除不需要的标题信息

2) 将上述结果传送到SED,SED将搜索每个“@”字符,并将其替换为自身+“\n”(这是一个“新行”又称CRLF),它将在输出流中的自己的行中获取每个“@”

3) 当您将上述输出从SED导入FIND/n命令时,您将在每行的开头添加行号。现在,您所要做的就是隔离每一行的数字部分,并在其前面加上“SET/a”,以将每一行转换为批处理语句,该语句(随着每一行的增加)将变量设置为该行的编号

4) 隔离各行的数字部分,并通过以下方式对隔离的数字进行排序:
| SED“s/\[\(.*\)\].*/Set\/a NumFound=\1/”

在上面的代码段中,您正在将前面命令的输出传送到SED,SED使用以下语法“s/WhatToLookFor/whattoreplaceittwith/”,以执行以下步骤:

a) 查找“[”(必须用“\”开头“转义”)

b) 开始保存(或“标记化”)以下内容,直至结束“]”

c)
\(
\)
之间的内容是“标记化”的,这意味着可以在以后的“WhatToReplaceItWith”部分中引用它。标记化的第一个东西通过“\1”引用,然后第二个被称为“\2”,等等

所以。。。我们忽略了[和],我们保存了括号之间的数字,忽略了每行的所有通配符剩余部分。。。因此,我们用文本字符串替换该行:
Set/a NumFound=
+保存的或“标记化”的数字,即。 …第一行将显示:
Set/a NumFound=1
…&下一行是:
Set/a NumFound=2

因此,如果您有1283个电子邮件地址,您的结果将有1283行

最后执行的一个=重要的一个

如果使用“>”字符将上述所有输出重定向到批处理文件,即:
>CountChars.bat


…然后调用该批处理文件&您将得到一个名为“NumFound”的DOS环境变量和您的答案。

谢谢您的回答,但是
findstr/R/N“^.*.*.*$“mail.txt | find/c”@
为我返回1。也许这是一个结果在一行中的问题。我认为这会起作用,但我的文本不是一行而是一个200KB的JSON,所以我得到了
FINDSTR:line 1太长了。
只要
grep-c-o
就足够了(或者
grep-o@| wc-l
如果你有一个没有DTR的bug
grep
find /C "@" < "mail.txt"
96
set "NUM=0"
for /F %N in ('find /C "@" ^< "mail.txt"') do set "NUM=%N"
echo %NUM%
type file.txt | find /i "@" /c
find "@" datafile.txt | find "@" | sed "s/@/@\n/g" | find /n "@" | SED "s/\[\(.*\)\].*/Set \/a NumFound=\1/">CountChars.bat
    --> in other words it ignores the brackets but stores the number
    --> the ".*" that follows the bracket wildcards whatever follows the "]"