2016-09-19 10 views
-1

ログファイルがあり、ログファイルを検索するためのキーワードがあります。今度は、検索キーの最初と最後の間で、そのログファイルからすべての内容を抽出する必要があります。すなわち、最初と最後のオカレンスの間のすべて。 findstrコマンドは検索キーを持つ行だけをリストし、その間には他の内容はリストしません。私はそれを行うためにバッチコマンドが必要です。検索キーの最初と最後の間でコンテンツを検索して出力するバッチコマンド

例えば、

log.txt 
[mave123]sddasnsdaskdasddansnmdmsmdasdasda 
[mave123]dfdfdf 
fsffasf 
safaaf 
fasfssfdfdsfdsf 
[mave123]dfsfsdfsdfssdfssfd 
[mave124]rdfsdfsfsfsf 
[mave124]dfdfsdfsfsdfs 

は今、「findstrのmave123のlog.txt」など

[mave123]sddasnsdaskdasddansnmdmsmdasdasda 
[mave123]dfdfdf 
[mave123]dfsfsdfsdfssdfssfd 

の下に戻りますが、私は拳とmave123の最後の発生の間のすべてのコンテンツをしたいです。すなわちこれのように。あなたは助けてもらえますか?

[mave123]sddasnsdaskdasddansnmdmsmdasdasda 
[mave123]dfdfdf 
fsffasf 
safaaf 
fasfssfdfdsfdsf 
[mave123]dfsfsdfsdfssdfssfd 
+0

[ツアーページ](http://stackoverflow.com/tour)全体を読んで、このサイトの仕組みを学んでください! – aschipfl

+1

https://stackoverflow.comは無料のスクリプト/コード作成サービスではありません。これまでに試したこと(既に使用しているスクリプト/コードを含める)とどこにいるのかを教えていただければ、特定の問題を解決することができます。 [良い質問をするにはどうすればいいですか?](https://stackoverflow.com/help/how-to-ask)も読んでください。 – DavidPostill

答えて

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q35976147.txt" 
SET "outfile=%destdir%\outfile.txt" 
SET "target=%~1" 
IF NOT DEFINED target GOTO :eof 
SET "startline=" 
FOR /f "delims=:" %%a IN ('findstr /N /L /c:"%target%" "%filename1%" ') DO (
IF NOT DEFINED startline SET /a startline=%%a 
SET /a endline=%%a 
) 
IF NOT DEFINED startline ECHO NOT found&GOTO :EOF 

(
FOR /f "tokens=1*delims=:" %%a IN ('findstr /N /r "." "%filename1%" ') DO (
IF %%a geq %startline% (
    IF %%a leq %endline% (ECHO %%b) ELSE (GOTO nextstep) 
) 
) 
)>"%outfile%" 
:nextstep 
GOTO :EOF 

あなたの状況に合わせてsourcedirdestdirの設定を変更する必要があります。

テスト用にデータが入っているq35976147.txtというファイルを使用しました。次いでstartlineに見つかった最初の行番号を割り当て、endline

に驚くべき最後:

は%OUTFILE%として定義ファイル

forプレフィックス LINENUMBER とターゲット文字列と一致する各ライン番号を生成します

2番目のforは操作を繰り返し、今回は選択した範囲の行を出力します。

これは、行内の先頭の:を抑制します。私は空白行をテストしていません。ここで、 "一致するすべてのファイル"

@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "target=%~1" 
IF NOT DEFINED target GOTO :eof 
FOR %%j IN ("%sourcedir%\log_*.txt".) DO (
ECHO %%j 
SET "startline=" 
FOR /f "delims=:" %%a IN ('findstr /N /L /c:"%target%" "%%j" ') DO (
    IF NOT DEFINED startline SET /a startline=%%a 
    SET /a endline=%%a 
) 
IF DEFINED startline (
    SETLOCAL enabledelayedexpansion 
    (
    FOR /f "tokens=1*delims=:" %%a IN ('findstr /N /r "." "%%j" ') DO (
    IF %%a geq !startline! IF %%a leq !endline! (ECHO %%b) 
) 
    ENDLOCAL 
)>"%destdir%\%%~nj.out" 
) ELSE (
    ECHO "%target%" NOT found IN %%j 
) 
) 
GOTO :EOF 

ため


改訂、%%jは、処理するファイルの名前を受け取ります。ソースファイル(%%~nj)の名​​前部分と.out A SETLOCAL/ENDLOCALのブラケットが作成され、実行時の値がstartlineendlineになるように、デスティネーションファイルが作成されます。

  • このアプローチでは、しばしば根本的にアプローチが変わるため、完全な問題を述べることをお勧めします。
+0

本当に感謝しています。しかし、ソースファイルが1つではなく複数のファイルであるソリューションを提供することもできますか?ファイルと同様にlog_09212016.txt、log_09222016、log_09232016 ...など、私はlog * .txtのようなすべてのファイルを検索したいのですか? – Bromeo

関連する問題