2013-12-13 2 views
1

Используя ниже, я смог подсчитать общее количество вхождений одного слова и получить результат, как показано ниже.Использование findstr для многострочного И поиска

@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 и возможно ли это с учетом ограниченной возможности RegExp Findstr? любое предложение, пожалуйста?

ответ

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 
+0

Привет, Аачини, я проверил ваш код. Если у вас есть «Unix_foo» или «Windowstoto», на которые они рассчитывают. – SachaDee

+0

спасибо Aacini ..! это именно то, что я хочу ..! – Sunny

+0

@ sachadee..активно я хотел посчитать слова Unix, Windows..не безразлично, как они входят в журнал ... так как вы также согласитесь, что 'Unix_foo' или' Windowstoto' отображают появление слов 'Unix' и' У Windows нет причин игнорировать их. :) – Sunny

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> 
... 
) 
+0

+ 1..yes, используя массив - правильная концепция.! – Sunny

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 
+1

1. Эта программа подсчитывает поиск слов только тогда, когда они появляются в одной строке; 2. Он рассчитывал бы _lines_ со строками, а не с отдельными строками, как требует OP (это и есть причина, потому что программа настолько сложна); 3. Выполняет команду 'findstr' столько раз, сколько целевых слов (ее можно выполнить только один раз, особенно если файл большой). PS - Почему вы используете странные символы, такие как '$' в именах переменных или '%% *' в параметре FOR? Пакетные файлы достаточно трудно читать без этих «пособий»! '8-)' – Aacini

+0

спасибо за ваш ответ @sachadee ... но за файл журнала даже с одним словом 'windows', это не дает правильный результат. – Sunny

+0

Чтобы иметь все происшествие, даже 'windowsSomething', вам просто нужно удалить это:' if/i "%% *" == "%% a" ', и тогда он будет считать каждое событие. – SachaDee

Смежные вопросы