批处理脚本从每个日志文件中提取相同的行

时间:2014-02-11 12:24:23

标签: batch-file

我有许多文本文件总是相同的行数 - 42并且每行总是相同类型的信息。此外,每一行都以标题开头。

我想要的是一个批处理脚本,以保持文本文件的第30行删除其他文件并保存文件。

我试图根据两行之间的信息查找该行。在这种情况下,第30行(工作注释)上的标题和第31行上的标题(工作号),然后将信息写入新文件。

第30行以

开头
Job Notes= (information specifically about the job)

第31行以

开头
Job Number=

这是我使用的代码(我在本网站的其他地方找到的代码),我根本没有输出。尝试了其他方法,所以如果你能看到更好的方法,就不必使用这种方法,基本上我只想让第30行成为文件中的唯一信息。

@ECHO OFF
SETLOCAL 
SET "sourcedir=C\Batch"
SET "destdir=C:\Batch\Extract"
for /f "tokens=1 delims=[]" %%a in ('find /n "Job Notes"^<"%sourcedir%\7099.txt" ') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "Job Number"^<"%sourcedir%\7099.txt" ') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%sourcedir%\00007099.txt" ') do (
IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%destdir%\newfile.txt"
GOTO :EOF

非常感谢任何帮助。 大卫

3 个答案:

答案 0 :(得分:0)

您希望/N标记为FINDSTR

FINDSTR /N /R ".*" *.txt | FINDSTR /R "\<30:" > out.txt

说明:

FINDSTR /N /R ".*" *.txt

在每个文本文件(".*")中查找每一行(/R带有正则表达式标记*.txt),并将其行号附加到前面(/N)。然后将其传送到

FINDSTR /R "\<30:"

仅抓取以(\<位)30:开头的行。

答案 1 :(得分:0)

选项1,使用findstr字符串编号

for %%a in (*.log) do (
    for /f "tokens=1,* delims=:" %%b in (
        'findstr /n "^" "%%a" ^| findstr /b "30:"'
    ) do (
        echo(%%c>"%%a"
    )
)

选项2,用于命令跳过线

setlocal disabledelayedexpansion
for %%a in (*.log) do (
    set "line="
    for /f "usebackq skip=29 delims=" %%b in ("%%a") do if not defined line set "line=%%b"
    setlocal enabledelayedexpansion
    echo(!line!>"%%a"
    endlocal
)

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL 
SET "sourcedir=C\Batch"
SET "destdir=C:\Batch\Extract"
for /f "skip=29tokens=1* delims==" %%a in ('type "%sourcedir%\7099.txt" ') do ECHO(%%b >"%destdir%\newfile.txt"&goto nextstep
:nextstep
GOTO :EOF

应该完成这项工作,找到第30行(跳过29),然后在分隔=上进行标记并输出一个,然后进入批次中的下一步。

尽管如此,您确实意识到您正在使用start设置end7099.txt,然后从00007099.txt中选择数据,不是吗? 00007099.txt是否存在?

c:\batch似乎是一个将数据文件存储给我的奇怪的地方。就个人而言,我将批处理文件放在那里(并将c:\batch包含在您的PATH中),但这是您的系统......