使用Windows批处理脚本匹配字符串后显示N行

时间:2015-03-14 02:06:53

标签: batch-file append

在Linux中,我们可以在匹配字符串后轻松显示N行,例如:

  

grep -A 100" string" file1> file2的

Windows批处理脚本中的等效命令是什么?

2 个答案:

答案 0 :(得分:0)

Windows批处理没有太大作用。你必须使用功能强大的基于.Net的PowerShell。

我希望您注意到Linux shell提供了一个出色的基础架构,但如果没有您提到的许多支持应用程序(例如grep),它将无能为力。

您的问题的答案是使用带有-Context选项的PowerShell sls命令:请参阅

https://superuser.com/questions/742115/powershell-equivalent-of-grep-r-l-files-with-matches

https://technet.microsoft.com/en-us/library/hh849903.aspx

答案 1 :(得分:0)

批次并非用于此类目的,但可以哄骗它来完成这项工作。

这是一个示范:

@ECHO OFF
SETLOCAL

:: look for various sections

CALL q29044669s "100lines.txt" "line45" 6
ECHO ======================================
CALL q29044669s "100lines.txt" "line21" 16
ECHO ======================================
CALL q29044669s "100lines.txt" "line11" 4
ECHO ======================================

GOTO :eof

这只会调用实际执行该作业3次的批处理,在文件line45/21/11中查找字符串100lines.txt并再现下面的6/16/4行。

100lines.txt只是一个测试文件,

line1
line2

等等。

这是一个实际完成工作的批次:

<强> q29044669S.bat

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:: reproduce %3 lines after finding %2 in file %1

SET "count="
FOR /f "usebackqdelims=" %%a IN ("%~1") DO (
 IF DEFINED count (
  ECHO(%%a
  SET /a count+=1
  IF !count! geq %3 GOTO :EOF 
 ) ELSE (
  ECHO(%%a|FIND /i "%~2">NUL
  IF NOT ERRORLEVEL 1 SET /a count=0
  REM if you want to output the line on which the target is found, remove the rem from the next line
  REM echo(%%a
 )
)
GOTO :EOF

/i命令上的find使匹配不区分大小写。

确保首先清除count,然后将文件的每一行应用到%%a(注意将跳过空行。)找到目标行后,count为初始化为0,然后再现以下行,每次count增加。达到限制时,批处理退出,结束本地环境,恢复count的初始值(已设置)

您可以使用

从命令行执行此操作
q29044669s "100lines.txt" "line45" 6

但由于它是一个批处理文件,因此需要在批处理中call进行编辑。

请注意,如果文件名/目标字符串包含分隔符(如空格或逗号),则仅严格要求引号,否则可省略。批次名称并不重要 - 请将其命名为您喜欢的名称。