2017-12-21 9 views
0

私は以下のようなログファイルがあります:私はfailedのすべての出現を検索し、段落の最後に次のドットまでを意味しているメッセージの最後までこの単語にラインと次の行を出力するにはどうすればよい特定の単語の後に段落の終わりまでログファイルからすべての行を印刷する方法は?

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単語とすべての行については

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」は「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. 

FINDSTRは、failed.またはで終わる行を検索し、ANSで始まる行を検索して出力します。ドットは、リテラル文字として解釈されるバックスラッシュを含む正規表現検索文字列内になければなりません。複数行の正規表現検索は、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" 

:各ラインOR合成上の2件の正規表現検索を実行

代替FINDSTRコマンドライン

出力は同じです。このコードは、大文字と小文字を区別しない任意の行を出力します。failedこの行と他のすべての行をファイル内の次の空行まで出力します。空行には空白または水平タブ文字ではなく、文字は含まれません。

あり、このコードには2つの問題があります:ラインの開始時にすべてのコロンは、することにより、各ラインの出力を分割するために必要なdelims=:によって除去されるように、1つのまたは複数のコロンで始まる

  1. 行は正しく出力されませんFINDSTR(行番号、コロン、行自体)。 FINDSTR は空行を含むすべての行が1行ごとに正の試合につながるラインの開始を探して、ファイルのFINDSTRを実行した後に行番号とコロンで始まるのででも空行FOR で処理するために使用されます。
  2. %%Jをファイルからの行に置き換えた後に、コマンドラインset "Line=%%J"に遅延環境変数拡張を有効にしたため、1つ以上の感嘆符を含む行が正しく出力されません。

他のない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. セミコロンで始まる行は;として FOR によって無視されますが、明示的に別の文字に設定されていないオプションeolのデフォルトです。この問題は、eol=に、ログファイルの行の先頭に絶対に存在しない文字を指定することで解決できます。
  2. %%Iをファイルからの行に置き換えた後に、コマンド行set "Line=%%I"で遅延環境変数拡張を有効にしたため、1つ以上の感嘆符を含む行が正しく出力されません。

Beginningで始まる行には、行内のどこにでもfailedという単語が含まれていないことが予想されます。使用するコマンドを理解し、どのように彼らは、コマンドプロンプトウィンドウを開き、そこに次のコマンドを実行し、完全にページが非常に慎重に、各コマンドのために表示されているすべてのヘルプを読んで、仕事のため


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

多くのありがとう.....素敵な。私はすべての解決策を試しています! –

関連する問題