指定したキーワードを含むファイルを検索する

2016年8月1日(更新: 2016年9月3日)

grepを使ったシェルスクリプト

このページから、実際に使えるシェルスクリプトを例に、コマンドや構文を詳しく解説していきます。

今回は、指定したキーワード(文字列)を本文に含むテキスト形式のファイルを探し出し、そのファイル名を一覧表示するシェルスクリプトを作ってみます。

実際のシェルスクリプト

今回題材とするシェルスクリプト(ファイル名は mygrep とします)を以下に記載します。

mygrep

  #!/bin/sh

  <<NOTE
  第1引数に指定した文字列を含んでいるファイルをカレントディレクトリ以下から検索して
  該当するファイル名を一覧表示する。サブディレクトリ内も検索する。
  第2引数が指定された場合は、拡張子の指定として扱う。
  スペースを含む文字列を検索したい場合はダブルクオーテーションで囲う。
  NOTE

  echo #改行のためのecho

  if [ -z "${1}" ]
  then
  # 第一引数を指定しなかった場合は、使い方を表示して終了する
    echo "(usage)"
    echo "  mygrep [text to search] [file extension]"
    exit
  fi

  searchText="${1}"

  echo "[setting]"
  echo "search text : ${searchText}"

  if [ -n "${2}" ]
  then
  # 第2引数がある場合
    extension="*.${2}"
    echo "extension   : .${2}"

    echo #改行のためのecho

    # 結果表示
    echo "[result]"
    grep -rl --include="${extension}" "${searchText}" *

    echo #改行のためのecho
    exit
  fi

  echo # 改行のためのecho

  # 結果表示
  echo "[result]"
  grep -rl "${searchText}" *

  echo #改行のためのecho
  

以下のようなディレクトリ構造があったと仮定して、シェルスクリプトを実行した例を示します。

    .
    ├── directory1
    │   ├── test2.c
    │   └── test3.txt
    ├── directory2
    │   ├── test4.c
    │   └── test5.txt
    └── test1.txt

カレントディレクトリにテキストファイル(.txt)が1つとフォルダが2つあり、フォルダの中にはテキストファイルとC言語のソースコード(.c)が保存されています。

また、test1.txt, test2.c, test5.txt には「banana」というキーワードが含まれているとします。

それでは、シェルスクリプトを実行します。シェルスクリプトが保存されているディレクトリにはパスが通っているとします。

    mygrep banana

結果

    [setting]
    search text : banana

    [result]
    test1.txt
    directory1/test2.c
    directory2/test5.txt

このように、キーワード「banana」を含むファイルの名前が一覧表示されます。

拡張子を指定する場合は、第2引数を指定します。

    mygrep banana c

結果

    [setting]
    search text : banana
    extension   : .c

    [result]
    directory1/test2.c

指定した拡張子に該当するファイルのみが一覧表示されます。

シェルスクリプトの解説

実行時引数をチェックする処理

このシェルスクリプトは、最低でも1つの実行時引数を受け取ります。検索するキーワードが何か分からなければ、検索のためのコマンドが実行できませんね。

利用者が引数を入力し忘れた場合は、メッセージを出してスクリプトの実行を終了させます。この処理を行うのが以下の部分です。

    ...

    if [ -z "${1}" ]
    then
    # 第一引数を指定しなかった場合は、使い方を表示して終了する
      echo "(usage)"
      echo "  mygrep [text to search] [file extension]"
      exit
    fi

    ...
  

if [ -z “${1}” ] という条件判定の意味は、「第一引数である ${1} の中身が空であるかどうか」です。詳しくはこちら

空であった場合、シェルスクリプトがどんな引数を受け取るのかを表示して exit を実行します。exitはその場でスクリプトの処理を終了するコマンドです。

第2引数が指定されたときの処理の分岐

先ほどの場合とは逆で、ある変数の値が空でない場合に処理を実行するif文を書きたい場合は、-n を使います。シェルスクリプトでは以下の部分です。

    ...

    if [ -n "${2}" ]
    then
    # 第2引数がある場合
      extension="*.${2}"
      echo "extension   : .${2}"

      echo #改行のためのecho

      # 結果表示
      echo "[result]"
      grep -rl --include="${extension}" "${searchText}" *

      echo #改行のためのecho
      exit
    fi

    ...
  

この部分が、今回のシェルスクリプトで最も重要なところです。キーワードを検索するUNIXコマンド「grep」をオプション付きで実行しています。

変数 searchText には、第1引数の「検索するキーワード」が代入されています。

    grep -rl --include="${extension}" "${searchText}" *

-rl に関してはこちらをご覧下さい。

第2引数が指定された場合は、検索ファイルの拡張子を絞り込むオプション –include=”拡張子” を有効にします。

if文の最後で exit を実行して処理を終了します。

第2引数が空だったときの処理

この場合は、-r -l オプション付きで grep を実行します。

    grep -rl "${searchText}" *

これで、指定したキーワードを含むファイルが検索できます。

その他

出力される結果が見やすいように、引数なしの echo で空の行を作っています

コメントを残す

メールアドレスが公開されることはありません。