如何用批量查找最后10行文件中的特定单词

时间:2017-02-08 22:47:31

标签: batch-file cmd command

我搜索了大量的互联网,无法找到使用批处理代码在文本文件的最后10行中查找特定单词的方法。到目前为止,我有这个在整个文件中查找文本。

>nul find "Example Words" examplefile.txt && (
REM Found...
goto next) || (
REM Not Found...
goto home
)

所以,再一次,它的作用是在整个文件中搜索示例单词,而我需要的是一种只在<中查找这些单词的方法strong>最后10行?

2 个答案:

答案 0 :(得分:0)

这包括/排除文件顶部或底部的n行。

<强>剪切

filter cut {t|b} {i|x} NumOfLines

从文件的顶部或底部剪切行数。

t - top of the file
b - bottom of the file
i - include n lines
x - exclude n lines

示例

cscript //nologo c:\folder\filter.vbs cut t i 5 < "%systemroot%\win.ini"

脚本filter.vbs

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Set rs = CreateObject("ADODB.Recordset")
With rs
    .Fields.Append "LineNumber", 4 

    .Fields.Append "Txt", 201, 5000 
    .Open
    LineCount = 0
    Do Until Inp.AtEndOfStream
        LineCount = LineCount + 1
        .AddNew
        .Fields("LineNumber").value = LineCount
        .Fields("Txt").value = Inp.readline
        .UpDate
    Loop

    .Sort = "LineNumber ASC"

    If LCase(Arg(1)) = "t" then
        If LCase(Arg(2)) = "i" then
            .filter = "LineNumber < " & LCase(Arg(3)) + 1
        ElseIf LCase(Arg(2)) = "x" then
            .filter = "LineNumber > " & LCase(Arg(3))
        End If
    ElseIf LCase(Arg(1)) = "b" then
        If LCase(Arg(2)) = "i" then
            .filter = "LineNumber > " & LineCount - LCase(Arg(3))
        ElseIf LCase(Arg(2)) = "x" then
            .filter = "LineNumber < " & LineCount - LCase(Arg(3)) + 1
        End If
    End If

    Do While not .EOF
        Outp.writeline .Fields("Txt").Value

        .MoveNext
    Loop
End With

这是一个通过计算dir命令输出中的行来计算文件夹的示例代码。

@SETLOCAL ENABLEDELAYEDEXPANSION
@CD C:\newfolder
@set count=0
@For /f "delims=" %%A in ('dir C:\newfolder\*.* /ad /s /b') Do (
    set /a count=!count!+1
@rem     If !Count! gtr 1 echo Num of folders
)

Set /a num=%random% %% %Count% + 1 
Echo %num%

@For /f "skip=%num% delims=" %%A in ('dir C:\newfolder\*.* /ad /s /b') Do (
Echo this is nth random folder
Echo Copy "%~dpnx0" "%%A"
Exit /b
)

答案 1 :(得分:0)

首先,计算文本文件中的行数:

for /F %%C in ('^< "examplefile.txt" find /C /V ""') do set "COUNT=%%C"

然后确定要跳过的行数(例如,除了最后10行之外的所有行):

if %COUNT% GTR 10 (set /A "SKIP=COUNT-10") else (set "SKIP=0")

最后,使用more command实际跳过这些行:

more +%SKIP% "examplefile.txt" | > nul findstr /L /I "Example Words" && (
    rem Found
    goto next
) || (
    rem Not Found
    goto home
)

使用findstr而非find指定多个 SPACE 分隔的搜索字符串或字词(例如此处为ExampleWords)。使用/I选项进行不区分大小写的搜索。

请注意,当输入文件包含65535或更多行时,more需要用户输入。它将 SPACEs 转换为 TABs ,但这不应该改变任何内容,因为您对搜索不感兴趣,因为您只搜索单词。

这是一种更复杂,效率更低的方法,依赖于for /F loop,同时使用上面派生的COUNT变量。它需要skip的{​​{1}}选项,其构建方式如下:

for /F

然后是前面提到的set /A "SKIP=COUNT-10" if %SKIP% GTR 0 (set "SKIP=skip=%SKIP%") else (set "SKIP=") 循环:

for /F

在循环中单独搜索每一行;一旦遇到匹配,就会执行for /F "%SKIP% delims=" %%L in ("examplefile.txt") do ( echo(%%L| > nul findstr /L /I "Example Words" && ( rem Found goto next ) ) ren Not Found goto home ; goto next打破了循环上下文,因此goto不再执行其正文内的任何命令。

注意for /F忽略空行,并且默认情况下以分号(for /F)开头。一些特殊字符(;^&()"<,{{1} })可能会导致管道中的>命令出现问题(|)。