2015-03-31 4 views
0

У меня есть файл журнала, который контролирует большую систему, включая запросы и подтверждения. Моя цель состоит в том, чтобы быть в состоянии:Пакетный скрипт для захвата строк с помощью findstr без пути к файлу

1. Loop через скрипт и получить строки, где запросы на & их подтверждения случаться

2. Вытащите целые линии значения как строки и сохранять их как переменные для изменения строки для вывода в другое место.

Вот что я до сих пор:

@ECHO off 
setlocal 
setlocal enabledelayedexpansion 
setlocal enableextensions 

:: Lets get today's date, formatted the way the ABCD File is named 
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do set targetDate=%%f-%%d-%%e 
:: Now we set the targetFile name 
SET ABCDLogsFile=C:\Users\me\Documents\monitoring_file_for_jim\ABCDFIX*%targetDate%.log 
::****Scrapped original approach***** 
set "ackFoundCount=0" 
set "reqFoundCount=0" 
::Get lines with acks 
for /f delims^=^ eol^= %%a in ('findstr /c:"\<ACK\>" "%ABCDLogsFile%"') do (
    set /a "ackFoundCount+=1" 
    setlocal enabledelayedexpansion 
    for %%N in (!ackFoundCount!) do (
     endlocal 
     set "ackFound%%N=%%a" 
    ) 
) 
::Get lines with requests 
for /f delims^=^ eol^= %%b in ('findstr /c:"ReqSingle" "%ABCDLogsFile%"') do (
    set /a "reqFoundCount+=1" 
    setlocal enabledelayedexpansion 
    for %%N in (!reqFoundCount!) do (
     endlocal 
     set "reqFound%%N=%%b" 
    ) 
) 

setlocal enabledelayedexpansion 
for /l %%N in (1,1,2 %reqFoundCount%) do echo REQ %%N FOUND= !reqFound%%N! 
pause 
for /l %%N in (1,1,2 %ackFoundCount%) do echo ACK %%N FOUND= !ackfound%%N! 
endlocal 

EDIT 2 dbenham

окольным путем я пытался сделать это, прежде чем было совершенно ненужным. Благодаря вопросы и ответить здесь:

'findstr' with multiple search results (BATCH)

У меня есть мой сценарий работает аналогичным образом. Тем не менее, мне любопытно, можно ли получить вывод findstr без пути к файлу в начале. Мне нужно только подстроить метку времени в журнале, которая всегда будет первым 12 символами каждой строки (без пути к файлу). Мой выход в настоящий момент имеет префикс пути, и, хотя я мог бы получить путь, где журнал в конечном итоге будет в производстве, было бы безопаснее попробовать и сделать это по-другому. В то время, когда этот скрипт будет запущен, будет только 1 или 2 reqs и каждый из них, поэтому я сохраняю все найденные. Это не обязательно, но я думаю, было бы обнадеживающим увидеть два, если их два. Вот то, что результат выглядит для квитанций и Reqs так:

C:\Users\me\Documents\monitoring_file_for_jim\ABCDFIX 2015-04-01.log:2015-03-26 07:00:11,028 INFO etc... 

Я думаю, что если бы я мог лишить FilePath от начала, то все, что я должен был бы сделать, чтобы получить только метки времени от событий будет

for /l %%N in (1,1,1 %reqFoundCount%) do echo Req %%N occurred at: !reqFound%%N:~0,12! >> MorningAckChecks.txt 
for /l %%N in (1,1,1 %ackFoundCount%) do echo ACK %%N occurred at: !ackfound%%N:~0,12! >> MorningAckChecks.txt 
+0

> «Я пытался использовать for/f с этими переменными в качестве параметров для пропустить и захватить эти строки, но я не могу сделать это правильно». Также опубликуйте этот код. –

+0

Извините. – driftandwander

+0

не легко использовать powershell! просто 'Select-String -Pattern" stack -List -SimpleMatch -Path F: \ Andorid \ Andorid.vmx | выберите «Линия», «Линейный номер», вы можете легко совместить линию с вашим рисунком и простыней! – powershell

ответ

1

Я подозреваю, что вы не могли бы получить SKIP работать, потому что вы вы перебор разделителей списка номеров линии с FOR утверждения, что означает, что число в переменной FOR. Проблема в том, что вы не можете включать переменные FOR или (замедленное расширение) при указании значения SKIP или любой другой опции FOR. Парсер-парсер оценивает параметры FOR перед расширением переменных FOR, поэтому он не может работать. Только нормальное расширение может использоваться при включении переменной как части опций FOR.

Но я не понимаю, почему вы считаете, что вам нужны номера строк. FINDSTR уже может разбирать строки, которые вы хотите. Просто используйте FOR/F для повторения каждой соответствующей строки. Для каждой строки определите переменную, содержащую содержимое строки, а затем используйте операции подстроки для анализа ваших желаемых значений.

Но я могу предложить альтернативу, которая, я думаю, может сделать вашу жизнь намного проще. JREPL.BAT - сложный текстовый процессор регулярных выражений, который может идентифицировать линии и анализировать и преобразовывать нужные значения за все время. JREPL.BAT - гибридный JScript/пакетный скрипт, который запускается изначально на любом компьютере Windows с XP и далее.

Если бы я знал, как выглядел ваш ввод, и какой у вас желаемый результат, то я, вероятно, мог бы сбить простое решение, используя JREPL.BAT. Или вы можете прочитать обширную встроенную документацию и понять ее сами.

Доступ к документации осуществляется из командной строки через jrepl /?. Возможно, вы захотите пропустить вывод через MORE, чтобы получить один экран помощи за раз. Но я никогда не делаю этого, потому что моя консоль командной строки настроена с большим выходным буфером, поэтому я могу просто прокрутить вверх, чтобы увидеть прошлый вывод.


EDIT - В ответ на комментарий и обновленный вопрос

Вот соответствующие фрагменты кода, которые вызывают проблемы.

SET ABCDLogsFile=C:\Users\me\Documents\monitoring_file_for_jim\ABCDFIX*%targetDate%.log 
findstr /c:"\<ACK\>" "%ABCDLogsFile%" 
findstr /c:"ReqSingle" "%ABCDLogsFile% 

Вопрос ваше определение ABCDLogsFile включает в себя подстановочные, который вызывает FINDSTR префикс каждой соответствующей строки полный путь к имени файла, где произошло совпадение.

У меня есть простое решение для вас - просто изменить определение ABCDLogsFile следующим образом:

SET "ABCDLogsFile=C:\Users\me\Documents\monitoring_file_for_jim\ABCDFIX<%targetDate%.log" 

Объяснение

Мое решение основывается на двух недокументированных возможностей

1) Недокументированные маски маски файлов.

  • < - Очень похоже на *
  • > - Очень похож на ?

Эти символы обычно используются для перенаправления, поэтому они должны быть либо цитироваться или сбежавшего, если вы хотите использовать их в качестве маски файлов.

Обсудить недокументированную функцию на DosTips - Dir undocumented wildcards. Посыпанные по всему потоку (и ссылка) являются примерами использования.

задокументировать мое понимание того, как именно нестандартные шаблоны работают на http://www.dostips.com/forum/viewtopic.php?p=39420#p39420

2) FINDSTR работает с нестандартными масками

FINDSTR будет префикс каждой соответствующей строки с именем файла (и, возможно, путь), если любой из следующих условий

  • опция /M используется
  • /F Opti на использовании
  • Несколько входных файлов в явном виде перечислены в командной строке
  • Несколько входных файлов подразумеваемой через файл маски, по меньшей мере, один * или ? шаблона в командной строке

Вы получаете самое префикс пути файла из-за последнего триггера - * в вашей маске файла.

Но вы можете использовать < вместо этого, чтобы получить тот же результат, за исключением того, что нестандартные подстановочные знаки не вызывают префикс файла в выходном файле.

Проблема решена :-)

Я говорю об этой функции Findstr в http://www.dostips.com/forum/viewtopic.php?p=39464#p39464.

В какой-то день я надеюсь обновить сообщение What are the undocumented features and limitations of the Windows FINDSTR command? с этим вкусным маленьким лакомством.

+0

Я видел много людей, которые говорили о JREPL.bat по различным партийным вопросам! Я определенно займусь этим, если это поможет решить мою проблему. Я очень четко представляю собой полный пакет noob, если FINDSTR уже может выполнить эту работу для меня, я просто не был уверен, что FINDSTR может найти нужную мне строку, а затем просто возьмите всю строку, в которую она включена, и сохраните ее в переменной. Я определенно буду смотреть в нее больше утром. Спасибо за ответ dbenham, ваш пакетный режим мастера предшествует вам. – driftandwander

+0

Можете ли вы взглянуть на редактирование, которое я сделал? Мне любопытно, есть ли способ удалить путь к файлу из вывода FINDSTR. – driftandwander

+0

@driftandwander - Это путь в исходном файле, или он добавлен FINDSTR? Если он находится в оригинале, то FINDSTR не может его разбить. Но JREPL мог сделать это легко. Если путь добавлен FINDSTR, тогда может быть способ избежать этого, в зависимости от того, что вызвало добавление пути. Вы должны показать свой код. – dbenham

1

Это сообщение стало немного захламленным. Было бы очень полезно, если бы вы разместили строки ввода, соответствующие выходу. Если вы не можете этого сделать, добавьте это заявление перед своим FOR. Я уверен, вы обнаружите, что testReqSkip пуст.

echo.testReqSkip=%testReqSkip% 
+0

О, значение testReqSkip равно @@, 264, 296 @@, его в исходном сообщении. Я сожалею, что этот пост больше не был ясен, я в настоящее время удален от своей рабочей станции и смогу прояснить больше, когда у меня снова будет доступ к нему. Настоятельно жаль! – driftandwander