【bat】複数のlogファイルからテキスト内の文字列を検索し、抽出するbatファイル

どうも、未だにスクリプトをMS-DOSで作成してると伝えてしまう 0 -Ray- です!

今回は私が作成し、実際に使っているbatファイルを紹介していきます!

今回のbatでできること複数のlogからテキスト内の文字列を検索し、抽出する

このbatは部材棚卸し作業をしている時に、管理表のSFPがどの機器に使用されているか調査する際に使用してました!
一番最後にダウンロードできるリンクを用意するのでご自由にお使いください!
それでは早速いきましょう!

スポンサーリンク

コード

@echo off

set str=%CD%
set str=%str%\target\*.log
type nul > find.txt
type nul > not_find.txt

setlocal enabledelayedexpansion

for /f %%a in (list.txt) do (
findstr %%a %str% >> find.txt

if !ERRORLEVEL! ==1 echo %%a >> not_find.txt

)

endlocal

コード解説

@echo off

set str=%CD%
set str=%str%\target\*.log
type nul > find.txt
type nul > not_find.txt

最初から丁寧に解説していきます!

@echo off はコマンドの画面表示を消すために設定してます。
これはお好みですが、私が作成するbatは基本的に全て設定してます。

set str にて検索対象のlogファイルのパスを指定しています。
CDはbatファイルが置かれているフォルダのパスが格納されているのがポイントです!
%変数%で変数に格納されている文字列を扱うことができます。

type nul > 〇〇.txt にて検索結果を抽出するファイルを生成します。
念のため空のテキストファイルを生成してから作業した方が安心です。
find.txtが検索して見つかった行を抽出、not_find.txtが検索して見つからない行を抽出します。

setlocal enabledelayedexpansion

for /f %%a in (list.txt) do (
findstr %%a %str% >> find.txt

if !ERRORLEVEL! ==1 echo %%a >> not_find.txt

)

endlocal

setlocal enabledelayedexpansion は最終行の endlocal とセットです。
これは遅延環境変数を使用する宣言となります。
これだけだと何のこっちゃわかりづらいのでもう少し解説させてください。

通常は行を読み込むときに変数の値を置き換えますが、この設定により
実際に実行した時に値の置き換えを行います
具体的な箇所は ERRORLEVEL です。

通常の処理ではfor文が読み込まれたときにこの変数の値が 0 になり、その後も0に固定されます。
しかし、本来の findstr の戻り値は 0:見つけた 1:見つからない 2:エラー です。
for文の中の処理でもこの戻り値を使用したいので設定してるイメージです。
実際にこのコマンドがないと戻り値が全て0になるので検索して見つからなかった文字列の特定が困難になります。

for /f %%a in (list.txt) do ( は、ループ処理です。
/f オプションでテキストファイルから読み込んだ行を処理できます。
変数のaは適当です。
今回はList.txtに検索対象の文字列を入れてます。

if !ERRORLEVEL! ==1 echo %%a >> not_find.txt こちらは見つからなかった文字列の処理です。
前述のとおり1は見つからなかった際の戻り値なので、その文字列は別テキストにまとめてます。

Download

以下が実際に使用しているbatです!ご自由にどうぞ!

最後までご覧いただきありがとうございます!
それでは良いエンジニアライフを!!

コメント

タイトルとURLをコピーしました