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

xzabzqsa  于 2023-01-14  发布在  Windows
关注(0)|答案(9)|浏览(667)

我有一个巨大的文件与电子邮件地址,我想计数有多少人在这个文件中。我怎么能使用Windows的命令行?
我试过这个方法,但是它只打印匹配的行。(顺便说一句:所有电子邮件都包含在一行中)
findstr /c:"@" mail.txt

okxuctiv

okxuctiv1#

使用您所拥有的,您可以通过find来传输结果。我经常看到这样的情况。

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

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

yptwkmov

yptwkmov2#

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

find /C "@" "mail.txt"

输出示例:

---------- MAIL.TXT: 96

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

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

输出示例:

96

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

set "NUM=0"
for /F %N in ('find /C "@" ^< "mail.txt"') do set "NUM=%N"
echo %NUM%
uqjltbpv

uqjltbpv3#

使用适用于Windows的grep

非常简单的解决方案:

grep -o "@" mail.txt | grep -c .

记住行尾有一个点!
这里有一点更容易理解的方式:

grep -o "@" mail.txt | grep -c "@"

第一个grep只选择“@”字符串,并将每个字符串放在新行上。
第二个grep计算行数(或带@的行数)。

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

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

下载和安装

1.从项目页面https://sourceforge.net/projects/grep-for-windows/下载最新版本。直接链接到文件是https://sourceforge.net/projects/grep-for-windows/files/grep-3.5_win32.zip/download
1.解压缩ZIP压缩包,里面有一个文件。
1.将grep.exe文件放入C:\Windows目录或使用echo %PATH%命令获得的系统路径列表中的其他位置。
测试grep是否正常工作:

  • 打开命令行窗口(cmd)
  • 运行命令grep --help
    卸载

从放置grep.exe文件的文件夹中删除该文件。

wvt8vs2t

wvt8vs2t4#

可能有点晚了,但是下面的脚本对我很有效(源文件包含引号字符,这就是为什么我使用'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!
mu0hgdu0

mu0hgdu05#

我在网上找到这个。看看能不能用:

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

rlcwz9us6#

我会在你的系统上安装unix工具(在任何情况下都很方便:-),然后它真的很简单-看,例如这里:
Count the number of occurrences of a string using sed?
(使用awk:

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

).
您可以在此处获得Windows unix工具:
http://unxutils.sourceforge.net/

iaqfqrcu

iaqfqrcu7#

好吧--来得太晚了,但是......似乎许多受访者都忽略了所有电子邮件地址都出现在一行的原始规范。这意味着除非您在每次出现@符号时都引入CRLF,否则您建议使用FINDSTR/c的变体将无济于事。
在DOS的Unix工具中有一个非常强大的SED.exe。谷歌一下。它震撼了RegEx。这里有一个建议:

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/WhatToReplaceItWith/"来执行以下步骤:
a)查找"["(必须通过在其前面加上""对其进行"转义")
b)开始保存(或"标记化")后面的内容,直到结束"]"

--> in other words it ignores the brackets but stores the number
    --> the ".*" that follows the bracket wildcards whatever follows the "]"

c)在\(\)之间的材料被"标记化",这意味着它可以稍后在"WhatToReplaceItWith"部分中被引用。标记化的第一材料通过"\1"被引用,然后第二材料通过"\2"被引用,等等。
所以......我们忽略了[和],保存了括号中的数字,忽略了每行中所有带通配符的剩余部分......因此,我们将该行替换为文字字符串:Set /a NumFound=+已保存或"标记化"的编号,即......第一行将显示:Set /a NumFound=1 ...&下一行内容如下:Set /a NumFound=2等等等等。
因此,如果您有1,283个电子邮件地址,则搜索结果将有1,283行。
最后执行的=最重要的。
如果使用"〉"字符将上述所有输出重定向到批处理文件,即:> CountChars.bat
...然后调用该批处理文件,您将得到一个名为"NumFound"的DOS环境变量,其中包含您的答案。

kiz8lqtg

kiz8lqtg8#

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

SET COUNT=0
FOR /F "tokens=4*" %%a IN ('TYPE "soapui.log" ^| FINDSTR.exe /I /R^
 /C:"Assertion" ^| FINDSTR.exe /I /R /C:"has status VALID"') DO (
  :: counts number of lines containing both "Assertion" and "has status VALID"
  SET /A COUNT+=1
)
SET /A PASSNUM=%COUNT%

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

pkbketx9

pkbketx99#

使用此命令:

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

相关问题