使用下面我能够计算单个单词的出现次数并获得结果如下所示。
@echo off
set "word=Windows"
set file=log.txt
set cnt=0
for /f ^"eol^=^
delims^=^" %%a in ('"findstr /i "/c:%word%" %file%"') do set "ln=%%a"&call :countWord
echo Server_Type Total_Users >result.txt
echo %word% %cnt% >>result.txt
exit /b
:countWord
setlocal enableDelayedExpansion
:loop
if defined ln (
set "ln2=!ln:*%word%=!"
if "!ln2!" neq "!ln!" (
set "ln=!ln2!"
set /a "cnt+=1"
goto :loop
)
)
endlocal & set cnt=%cnt%
exit /b
的Result.txt
Server_Type Total_Users
Windows 24
现在我想添加6个新单词,如Linux,MacOS,Andriod,Unix ....等,在同一个日志文件中搜索并获得相同格式的结果。
但没有得到如何使用FINDSTR实现这一点,并且鉴于Findstr的RegExp功能有限,这可能吗?有什么建议吗?
答案 0 :(得分:1)
我还没试过这个,但概念如下:
@echo off
set "word=Windows Linux MacOS ..."
set file=log.txt
set cnt=0
for %%i in (%word%) do (
for /f ^"eol^=^
...
<the rest of your code>
...
)
答案 1 :(得分:1)
我稍微修改了您的程序,以便将cnt
变量转换为具有不同单词作为下标的array,例如cnt[Windows]=0
,cnt[Linux]=0
等。 :countWords
子例程搜索每个匹配行中的所有单词。我还从setlocal
子例程中删除了:countWords
,以便更容易地返回cnt
数组的值。
@echo off
setlocal EnableDelayedExpansion
set "words=Windows Linux MacOS Andriod Unix"
set file=log.txt
for %%a in (%words%) do set cnt[%%a]=0
for /f ^"eol^=^
delims^=^" %%a in ('"findstr /i "%words%" %file%"') do call :countWords "%%a"
(echo Server_Type Total_Users
for %%a in (%words%) do (
echo %%a !cnt[%%a]!
)) > result.txt
exit /b
:countWords
set wordList=%words%
:nextWord
for /F "tokens=1*" %%a in ("%wordList%") do (
set word=%%a
set wordList=%%b
)
set "ln=%~1"
:loop
if defined ln (
set "ln2=!ln:*%word%=!"
if "!ln2!" neq "!ln!" (
set "ln=!ln2!"
set /a "cnt[%word%]+=1"
goto :loop
)
)
if defined wordList goto nextWord
exit /b
答案 2 :(得分:0)
获取计数的一种更简单的方法:您只需在搜索字符串的名称前加上一个#,并使用Set /a #%%a+=1
增加此新变量的值(如果字符串真的相同),然后使用set #
你得到了所有的指控。非常简单高效。 (对不起我可怕的英语)
@ECHO OFF
set "$file=log.txt"
set "$Lsearch=windows unix linux macOs Android"
for %%a in (%$LSearch%) do (set #%%a=0
for /f "delims=" %%* in ('type %$file% ^| findstr /i "%%a"') do if /i "%%*"=="%%a" set /a #%%a+=1)
for /f "tokens=1,2 delims==" %%a in ('set #') do echo Server : %%a Total User : %%b