批处理文件,查看txt文件并从txt中找到权限被拒绝,然后打印接下来的10行



我需要创建一个批处理脚本,该脚本将查看文本文件内部并从中搜索"permission denied"字符串。

如果脚本将找到上面的字符串,那么它将打印搜索字符串("permission denied")之后可用的下10行。

下面是我正在尝试的代码,但它没有提供所需的结果:

for /F "delims=:" %%a in ('findstr /I /N /C:"permission denied" %temp%') do                 (
echo %%a
set /A after=%%a
set nextline=!after!+1
set "numbers=!after!:"
echo !numbers!
echo %nextline%
)
rem Search for the lines
for /F "tokens=1* delims=" %%a in ('findstr /N "^" %temp% ^| findstr /B "%numbers%"') do echo %%~nb

上面的代码只生成行号。不是内容

应该可以:

@echo off
SETLOCAL EnableDelayedExpansion
SET /a printLines=0
FOR /F "tokens=*" %%l IN (<your log file>) DO (
    SET line=%%l
    SET line=!line:permission denied=!
    IF NOT %%l==!line! SET /a printLines=11
    IF !printLines! GTR 0 (
        ECHO %%l
        SET /a printLines=!printLines!-1
    )
)
PAUSE

@echo off
setlocal enabledelayedexpansion
set temp=input.txt
for /F "tokens=1 delims=:" %%a in ('findstr /I /N /C:"permission denied" "%temp%"') do (
    set /a start=%%a + 1
    set /a end=%%a + 10
)
FOR /L %%I IN (%start%,1,%end%) DO SET LINES=!LINES! %%I:
FOR /F "TOKENS=* delims= " %%G in ("!lines!") DO SET lines=%%G 
echo %lines%
rem Search for the lines
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%temp%" ^| findstr /B "%lines%"') do echo %%b
pause

前10行
@echo off
setlocal enabledelayedexpansion
set temp=input.txt
for /F "tokens=1 delims=:" %%a in ('findstr /I /N /C:"permission denied" "%temp%"') do (
    set /a start=%%a - 10
    set /a end=%%a -1
)
IF %start% lss 1 set start=1
FOR /L %%I IN (%start%,1,%end%) DO SET LINES=!LINES! %%I:
FOR /F "TOKENS=* delims= " %%G in ("!lines!") DO SET lines=%%G 
echo %lines%
rem Search for the lines
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%temp%" ^| findstr /B "%lines%"') do echo %%b
pause

我认为这是最快/最简单的方法:

@echo off
setlocal EnableDelayedExpansion
set "temp=input.txt"
for /F "delims=:" %%a in ('findstr /I /N /C:"permission denied" "%temp%"') do set "line=%%a"
set lines=0
for /F "delims=" %%a in ('more +%line% "%temp%"') do (
   echo %%a
   set /A lines+=1
   if !lines! equ 10 goto break
)
:break

要显示匹配行之前的10行,只需将do set "line=%%a"更改为do set /A "line=%%a-11",并首先在下面添加这一行:if %line% lss 0 set "line=0"

最新更新