在批处理或VBS中搜索后获取上下文行

时间:2013-08-01 21:53:10

标签: batch-file vbscript

所以我有一个文本文件,其中填写了这种格式

Identifier: NUMBER1
    Information1 = something
    Information2 = other something
    Information3 = more something

Indentified: NUMBER2
    Information1 = something
    Information2 = other something
    Information3 = more something

我尝试过使用findstr但是,与grep不同,它不能给我一些上下文。

如何获取上下文行以便我可以搜索其他信息?

如果可以,我可以在Windows上安装grep和awk等,但这是一个向其他人发布的工具,因此我只能使用操作系统的本机,在这种情况下是批处理和VBS。

我想要做的等效unix表达式如下:

grep -A 4 "NUMBER1" file | grep "Information2" | awk ' { print $3 } ' #not sure if $3 or $2 off the top of my head

4 个答案:

答案 0 :(得分:1)

试试这个:

@ECHO off&SETLOCAL
FOR /f "delims=:" %%a IN ('findstr /n "NUMBER1" file') DO SET "skip=%%a"
FOR /f "tokens=2*" %%b IN ('more +%skip% file ^| findstr "Information2"') DO IF NOT DEFINED line SET "line=%%c"
ECHO %line%

另见findstr /?

答案 1 :(得分:1)

你可以在VBScript中做这样的事情:

If WScript.Arguments.Count <> 2 Then
  WScript.Echo "Usage: " & WScript.ScriptName & " pattern filename"
  WScript.Quit 1
End If

Const Context = 3 'lines

Set fso = CreateObject("Scripting.FileSystemObject")

Set re = New RegExp
re.Pattern = WScript.Arguments(0)

n = 0
Set f = fso.OpenTextFile(WScript.Arguments(1))
Do Until f.AtEndOfStream
  line = f.ReadLine
  If re.Test(line) Then
    WScript.Echo line
    n = Context
  ElseIf n > 0 Then
    WScript.Echo line
    n = n - 1
  End If
Loop
f.Close

Hovever,这只是一个非常基本的草案,有很大的改进空间(例如,将上下文行的数量作为参数,在上下文之前添加等)。

答案 2 :(得分:0)

除非您使用的是相当旧的系统,否则您可能已安装了Windows 。使用Powershell,您可以执行类似于grep的操作,如下所示:

Get-Content <filename> | Where-Object {$_ -like "*<pattern>*"}

答案 3 :(得分:0)

您可以使用一个非常有用的类似grep的工具,它是一个名为findrepl.bat的辅助批处理文件 - http://www.dostips.com/forum/viewtopic.php?f=3&t=4697

type "file.txt"|findrepl "NUMBER2" /O:-0:+3

您可以从搜索结果窗口进一步搜索。