批处理脚本 - 逐行读取

时间:2010-12-24 18:51:31

标签: batch-file

我有一个日志文件,我需要逐行读入并将该行传递给下一个循环。

首先,我在一个单独的文件中grep日志文件中的“主”字(如“错误”) - 以保持较小。现在我需要获取单独的文件并逐行读取 - 每行需要转到另一个循环(在这些循环中我grep日志并将其划分为块)但我卡在这里。

日志看起来像

xx.xx.xx.xx - - "http://www.blub.com/something/id=?searchword-yes-no" 200 - "something_else"

使用for / f循环我只获取IP而不是完整的行。

如何管道/写入/缓冲整行? (每行写什么都没关系)

4 个答案:

答案 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)。