2017-12-21 1 views
0

나는 로그 파일을 아래와 같이있다 :특정 단어 다음에 단락 끝까지 로그 파일의 모든 줄을 인쇄하는 방법은 무엇입니까?

Beginning difffull backup for database Managed_Metadata_Service, 3 of 149. 
Full: 0 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Full: 4 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Backup of Managed_Metadata_Service failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 

Beginning difffull backup for database model, 4 of 149. 
Full: 0 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Full: 2 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Full: 4 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Backup of model failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 

Beginning difffull backup for database msdb, 5 of 149. 
Full: 0 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Full: 4 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Backup of msdb failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 

Beginning difffull backup for database Search_Service_Application_AnalyticsReportingStoreDB, 6 of 149. 
Full: 0 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Full: 4 Read: 6144 Written: 0 Rate: 0.00 Kb/Sec 
Backup of Search_Service_Application_AnalyticsReportingStoreDB failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 

어떻게 failed의 모든 항목을 찾은 다음 단락의 끝에서 다음 점까지 뜻이 단어와 메시지 끝날 때까지 다음 라인으로 라인을 인쇄 할 수 있습니다 또는 파일의 끝?

결과는 다음과 같다 : failed 단어로 모든 라인에 대한

Backup of Managed_Metadata_Service failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 
. 
. 
Search_Service_Application_AnalyticsReportingStoreDB failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 

.

@echo off 
setlocal EnableDelayedExpansion 
set numbers= 
for /F "delims=^" %%a in ('findstr /I /N /C:"failed" Backup_DIFF_2017-12-14.log') do (
    set /A sameline=%%a, after=%%a+1 
    set "numbers=!numbers!!sameline!: !after!: " 
) 
rem Search for the lines 
(
    for /F "tokens=* delims=^ %%a in ('findstr /N "^" Backup_DIFF_2017-12-14.log ^| findstr /B "%numbers%"') do echo %%b 
) > result.txt 
+0

'find'failed file.log'? – Stephan

+0

나는 그것을 찾기 위해 배치 파일을 만들어 단어 (실패)와 다음 줄에 오류 메시지 –

+0

@CienzoJoshua가 포함 된 줄을 인쇄하고, 파일 내용을 선택/강조 표시 한 다음 **'{}'을 누르십시오 ** 단추. – Compo

답변

1

이 로그 파일의 예 Stephan 의해 제안 간단한 해결책이 :

@%SystemRoot%\System32\findstr.exe "failed\.$ ^ANS" "Backup_DIFF_2017-12-14.log" 

이 단일 명령 라인 출력 :

여기

는 지금까지 가지고 코드
Backup of Managed_Metadata_Service failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 
Backup of model failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 
Backup of msdb failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 
Backup of Search_Service_Application_AnalyticsReportingStoreDB failed. 
ANS0238E (RC2041) The sequence of calls is invalid. 

FINDSTRfailed.또는으로 끝나는 행을 ANS으로 시작하는 행에서 검색하고 해당 행을 출력합니다. 점은 리터럴 문자로 해석 될 백 슬래시가있는 정규식 검색 문자열에 있어야합니다. 여러 줄 정규식 검색은 FINDSTR에 의해 지원되지 않습니다.

대체 또한 결합 각 라인 OR 두 정규식 검색을 실행 FINDSTR 커맨드 라인 :

@echo off 
if not exist "Backup_DIFF_2017-12-14.log" goto :EOF 

setlocal EnableExtensions EnableDelayedExpansion 
set "PrintLines=" 

for /F "tokens=1* delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /N /R "^" "Backup_DIFF_2017-12-14.log"') do (
    if "%%J" == "" (
     set "PrintLines=" 
    ) else (
     set "Line=%%J" 
     if not "!Line:failed=!" == "!Line!" set "PrintLines=1" 
    ) 
    if defined PrintLines echo %%J 
) 

endlocal 
:

@%SystemRoot%\System32\findstr.exe /R /C:failed\.$ /C:^ANS "Backup_DIFF_2017-12-14.log" 

더 복잡한 솔루션이 배치 코드를 사용

출력이 동일합니다. 이 코드는 대/소문자를 구분하지 않는 모든 행을 출력하고이 행뿐만 아니라 파일의 다음 빈 행까지 다른 모든 행을 출력합니다. 빈 줄에는 공백이나 가로 탭 문자가 아닌 문자가 포함되지 않습니다.

가이 코드를 사용하여이 문제입니다 : 하나 이상의 콜론으로 시작

  1. 라인 각 라인 출력을 분할하는 데 필요한 delims=:에 의해 제거되는 행의 시작시 모든 콜론으로 올바른 출력되지 않습니다 FINDSTR에는 줄 번호, 콜론 및 줄 자체가 있습니다. FINDSTR 은 빈 줄을 포함한 모든 라인 모든 라인에 긍정적 인 경기 결과를 라인의 시작을 검색 할 파일에 FINDSTR를 실행 한 후 행 번호와 콜론으로 시작하기 때문에도 빈 라인 에 의해 처리하는 데 사용됩니다.
  2. %%J을 파일의 행으로 대체 한 후 명령 줄 set "Line=%%J"에 적용된 지연된 환경 변수 확장으로 인해 하나 이상의 느낌표가 포함 된 줄이 올바르지 않습니다.

또 다른 100 % 완벽한 솔루션이 배치 코드는 대소 문자를 구분 해석 둘째 솔루션에 비해

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "PrintLines=" 

for /F "usebackq delims=" %%I in ("Backup_DIFF_2017-12-14.log") do (
    set "Line=%%I" 
    if "!Line:~0,9!" == "Beginning" (
     set "PrintLines=" 
    ) else (
     if not "!Line:failed=!" == "!Line!" set "PrintLines=1" 
    ) 
    if defined PrintLines echo %%I 
) 

endlocal 

Beginning에서 대신 빈 줄의 새 단락과 같은 라인의 시작합니다. 따라서 () 명령은 빈 줄을 무시하고 직접 파일을 처리 할 수 ​​있습니다.

는 그러나 또한이 솔루션은 두 가지 문제가 있습니다 ;위한 무시 세미콜론 (;)으로 시작

  1. 라인을 명시 적으로 다른 문자로 설정되지 옵션 eol의 기본이다. 이 문제는 eol=을 로그 파일의 한 줄 시작 부분에 절대 존재하지 않는 문자로 지정하여 해결할 수 있습니다.
  2. %%I을 파일의 행으로 대체 한 후 명령 줄 set "Line=%%I"에 적용된 지연된 환경 변수 확장으로 인해 하나 이상의 느낌표가 포함 된 줄이 올바르지 않습니다.

는 그것은 선이 단어를 포함하지 않는 failed 어디 라인에 Beginning로 시작하는이 솔루션이 예상된다. 사용 된 명령을 이해하고 작동 방법에 대한


은 명령 프롬프트 창을 열고 거기에 다음 명령을 실행하고 모든 도움말 페이지는 매우 신중하게 각 명령에 대해 표시 완전히 읽어 보시기 바랍니다.

  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?
+0

많은 감사 ..... 사랑스러운. 나는 모든 해결책을 시도하고있다! –

관련 문제