在Linux中,我们可以在匹配字符串后轻松显示N行,例如:
grep -A 100" string" file1> file2的
Windows批处理脚本中的等效命令是什么?
答案 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
答案 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
进行编辑。
请注意,如果文件名/目标字符串包含分隔符(如空格或逗号),则仅严格要求引号,否则可省略。批次名称并不重要 - 请将其命名为您喜欢的名称。