ファイルの文字列を順次GREPし結果をファイル出力するシェルスクリプト

手動で文字列1個ずつGREPはうんざり

急な調査依頼に対して、既存のプログラムに関する調査を人海戦術で行うことが度々発生する現場がありました。プログラムファイルの数が結構膨大で、キーワードとなるテーブルIDやカラム名でGREPを実行し、結果をファイルに保存するような作業をよく行っていたものです。

検索キーワードも、1個や2個で済むときもあれば、何十ものキーワードで何百ものプログラムファイルをGREPする必要があり、しかも調査期間が「今日中」とか「明日の昼まで」とか、結構タイトな期限を言われたりすることも。

で、自動化のための時間を割くことを後回しにし続けたことで、ひたすら複数人で手分けしてGREPを実行するなんてこともありました。今思えば、もうちょっと作業時間短縮のためにやりようがあったのでは、と思うことも。

自動化のためにGREPツールをシェルスクリプトで作成

当時、簡単なGREPツールを作りたいという依頼があったので、ひとまずシェルスクリプトでGREPツールを作成して依頼者に提示したこともありましたが、日の目を見ることは無かったような気がします。

せっかくなので、同じような調査に手動で挑んでいる方のお役に立てればと思い、当時作成したシェルスクリプトを思い出しながら再現してみたいと思います。

外部ファイルに切り出した文字列を読み込んでGREP

と言っても、それほど大した仕組みではありません。
複数の検索キーワードでファイルをGREPし、結果をファイル出力するところまでをツール化したものをご紹介したいと思います。

#!/bin/bash

# 引数1:検索する文字列リスト(utf-8, lf)
# 引数2:検索対象ディレクトリ
echo $1
echo $2

while read line
do
  echo $line
  # grep_(検索文字列).txtというファイル名で検索結果を出力
  # -r ディレクトリ内も検索対象
  # -n 検索結果に行番号も表示
  grep -r -n $line $2 > grep_${line}.txt
done < $1

exit 0

引数のチェックなどは省略していますのでご了承ください。

上記ソースファイル内のコメントの通り、必要な引数は2つで、1つは検索する文字列リストファイル名で、もう1つは検索対象となるディレクトリパスとなります。

検索する文字列リストは、単純に1行ごとに検索文字列を記載しているだけのファイルです。
以下の例だと、検索文字列はtest_1、test_7の2つです。
(以下の画像はVS Codeで表示した状態)

grepした文字列ごとに結果をファイル出力

ここまでシンプルなコードで、わざわざ目次を変えて書くほどの事でもないのですが、
grepした文字列ごとに、結果をファイル出力させるようにしています。
ファイル名は、先頭に「grep_」を付けて、その次に検索した文字列をつなげています。
もし文字列が「hoge」なら、「grep_hoge.txt」という感じです。

とりあえず、動作検証のために、ランダムな文字列を含む100個のファイルを「テスト」フォルダに用意しました。
testfile_1.txt~testfile_100.txtという感じで作りました。
ファイルの中身は、「test_0~test_9」までの10個の文字列の中からランダムにセットしています。

実際に、以下の通りシェルスクリプトを実行してみました。
Hello Worldは気にしないでください。。。(テスト文字列出力の消し忘れ)

searchwordlist.txtには、test_1とtest_7という文字列をセットしています。
この文字列のGREP結果が、grep_test_1.txt、grep_test_7.txtというファイルに出力されています。

test_1のGREP結果を開いてみると、こんな感じになっています。

これを手動で、1個の文字列ごとにGREPを実行することを考えると、やっぱりスクリプト化してしまったほうが労力と時間を節約できるのは明らかです。

紹介したシェルスクリプト自体は大したものではありませんが、GREPツールを検討されている方の参考になればと思います。

Linux関連という事で、初心者向けのオススメ書籍についても以下で紹介しています。ぜひご覧ください。

なかなか腰を据えて学べないLinux 恥ずかしながら、私がLinuxを仕事で本格的に触り始めたのは40代になってからでした。...

シェアする

  • このエントリーをはてなブックマークに追加

フォローする