如何使用windows命令行查找文件中字符串的出现次数?
我有一个带有电子邮件地址的巨大文件,我想计算一下这个文件中有多少文件。如何使用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命令中没有垃圾字符
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的buggrep
)
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 "]"