我有一个日志文件,我需要逐行读入并将该行传递给下一个循环。
首先,我在一个单独的文件中grep日志文件中的“主”字(如“错误”) - 以保持较小。现在我需要获取单独的文件并逐行读取 - 每行需要转到另一个循环(在这些循环中我grep日志并将其划分为块)但我卡在这里。
日志看起来像
xx.xx.xx.xx - - "http://www.blub.com/something/id=?searchword-yes-no" 200 - "something_else"
使用for / f循环我只获取IP而不是完整的行。
如何管道/写入/缓冲整行? (每行写什么都没关系)
答案 0 :(得分:54)
试试这个:
@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}},所以整行。
答案 1 :(得分:6)
“通话”解决方案存在一些问题。
它失败了许多不同的内容,因为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
答案 2 :(得分:2)
这在过去对我有用,如果可以,它甚至会扩展文件中的环境变量。
for /F "delims=" %%a in (LogName.txt) do (
echo %%a>>MyDestination.txt
)
答案 3 :(得分:0)
对于路径中有空格的用户,您将需要以下内容: n.b.它会扩展到绝对路径,而不是相对路径,因此,如果正在运行的目录路径中包含空格,则这些空格也将计入。
set SOURCE=path\with spaces\to\my.log
FOR /F "usebackq delims=" %%A IN ("%SOURCE%") DO (
ECHO %%A
)
说明:
(path\with spaces\to\my.log)
由于空格,将不会解析。 如果变为:
("path\with spaces\to\my.log")
它将作为字符串而不是文件路径来处理。
"usebackq delims="
See docs将允许将该路径用作路径(感谢Stephan)。