批量计数 /f 的 findstr 结果

batch counting findstr results for /f

提问人:NulisDefo 提问时间:10/15/2015 最后编辑:NulisDefo 更新时间:7/16/2017 访问量:6113

问:

我有一个apache.log文件。我正在尝试制作一个批处理文件,以便能够计算登录总数。基本上是几行。
我最初的想法是设置一个变量 results=0,每当 findstr 命令获得结果时,我都会获得变量值的 +1,并最终显示该值。不知道这是否是正确的思维方式。
到目前为止,我对 /f 命令的印象可能是关键,尽管我从未使用过它,但很多部分我都不清楚。
下面是 .log 文件行的示例

67.195.112.96 - - [22/Feb/2010:00:06:03 +0200] "GET /www/kurpiai/dalyviai/?did=118 HTTP/1.0" 200 41119 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)"  

到目前为止,我的尝试如下:

findstr ^[1-9] apache.log  
for /f %%G in ('findstr ^[1-9] apache.log') do echo result %%G

现在我明白了,在这种情况下,%%G 值被替换为每个 findstr 结果。有了这个,我得到了与 findstr 匹配的每一行的回声,然后是每个 IP 地址。为什么?
我相信也许我可以以某种方式利用 %%G 值每次都会变化的事实来设置我自己的变量。为什么 %%G 会精确地获取 IP 值?
或者也许我错了,我根本不需要 /f 来完成这项任务?

批处理文件

评论

0赞 user1016274 7/16/2017
您只获得每个匹配行的回显 IP 地址的原因是将行拆分为默认分隔符(空白)处的字段。因此被分配了第一个空白分隔项(“单词”),即地址。 包含第二个“单词” - 此处为单个连字符。查看有关 和 参数的更多详细信息。for /f%%G%%Hfor /?delims=tokens=

答:

10赞 user1016274 10/15/2015 #1

我会说你没有。只需将您的命令与DOS风格相结合:findstrwc -l

findstr "^[1-9]" abc.txt | find /v "" /c

第一部分选择符合您意图的行,第二部分计算 (/c) 这些不匹配的行(即全部)。

edit:如果您需要变量中的结果:

for /f %%a in ('findstr /R "^[1-9]" abc.txt ^| find /c /v ""') do set "count=%%a"

评论

0赞 domih 2/10/2021
为什么推荐(这似乎有效)然后使用?wc -lfind
0赞 user1016274 2/11/2021
因为“wc”是一个 *nix 命令(Unix、Linux),并且不包含在 Windows 中,所以“find”自 DOS 以来一直存在。实际上,“wc -l”和“find /c”做同样的事情,即计数行。
0赞 domih 2/12/2021
哦,该死的,我忘了我已经安装了适用于 Windows 的 GNUtils :D