Пакет script - читать строки за строкой
У меня есть файл журнала, который мне нужно прочитать в строке за строкой и передать строку в следующий цикл.
Во-первых, grep файл журнала для "основного" слова (например, "ошибка" ) в отдельном файле - чтобы он был небольшим. Теперь мне нужно взять отдельный файл и прочитать его в строке за строкой - каждая строка должна перейти в другой цикл (в этом цикле я grep журналы и разделить его в блоках), но я застрял здесь.
Журнал выглядит как
xx.xx.xx.xx - - "http://www.blub.com/something/id=?searchword-yes-no" 200 - "something_else"
с циклом for/f Я просто получаю IP вместо полной строки.
Как я могу передать/написать/буферизировать всю строку? (не имеет значения, что написано в строке)
Ответы
Ответ 1
Попробуйте следующее:
@echo off
for /f "tokens=*" %%a in (input.txt) do (
echo line=%%a
)
pause
из-за tokens=*
все записывается в %a
изменить:
чтобы ответить на ваш комментарий, вам придется сделать это следующим образом:
@echo off
for /f "tokens=*" %%a in (input.txt) do call :processline %%a
pause
goto :eof
:processline
echo line=%*
goto :eof
:eof
Из-за пробелов вы не можете использовать %1
, потому что это будет содержать только часть до первого пробела. И поскольку строка содержит кавычки, вы также не можете использовать :processline "%%a"
в сочетании с %~1
. Поэтому вам нужно использовать %*
, который получает %1 %2 %3 ...
, поэтому вся строка.
Ответ 2
Решение "вызов" имеет некоторые проблемы.
Он терпит неудачу со множеством разных содержимого, так как параметры CALL
анализируются дважды парсером.
Эти линии будут создавать более или менее странные проблемы.
one
two%222
three & 333
four=444
five"555"555"
six"&666
seven!777^!
the next line is empty
the end
Поэтому вы не должны использовать значение %%a
с вызовом, лучше переместите его в переменную, а затем вызовите функцию только с именем переменной.
@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
set "myVar=%%a"
call :processLine myVar
)
goto :eof
:processLine
SETLOCAL EnableDelayedExpansion
set "line=!%1!"
set "line=!line:*:=!"
echo(!line!
ENDLOCAL
goto :eof
Ответ 3
Это сработало для меня в прошлом, и оно даже расширит переменные среды в файле, если это возможно.
for /F "delims=" %%a in (LogName.txt) do (
echo %%a>>MyDestination.txt
)