勉強メモ28_シェルスクリプトを利用して、ある特定のディレクトリにあるファイル一覧から検索したい文字列を検索しファイル出力するGrepツール

##0 はじめに

・シェルスクリプトを利用して、
　ある特定のディレクトリにあるファイル一覧から
　検索したい文字列を検索しファイル出力するGrepツールです。

・検索する拡張子は、.sh、.java、.php、.jspです。
　検索したい拡張子を変更したい場合、
　シェルスクリプトのfindコマンドの箇所を検索したい拡張子に変更する

・実行権限がなかったりするファイルはエラーファイルに出力します。

・適当に作ったので、恐らく不備があるかもです

##1 今回作成したシェルスクリプトのソース

```shell:grep_jikkou.sh
#!/bin/bash

WORK_DIR=/home/user/rinrin/grep_chousa
RESULT_DIR=${WORK_DIR}/result

#実行時に指定する引数が2個より小さい場合は入力パラメータエラー
if [ $# -lt 2 ]; then
  echo '入力パラメーターの引数が足りません　指定例：grep_jikkou.sh /apuri/souce 'rinrin' '
  exit 1
fi

KENSAKU_DIR=$1
KENSAKU_MOJI=$2

NOW_TIME=`date +"%Y%m%d%H%M%S"`
OUTFILE=${RESULT_DIR}/`echo "${KENSAKU_DIR}" |sed -e "s/\//_/g"`"."`echo "${KENSAKU_MOJI}" |sed -e "s/\//_/g"`".${NOW_TIME}.txt"
WHOAMI=`whoami`
HOSTNAME=`hostname`
COMMAND="find ${KENSAKU_DIR} -follow -type f -regex '.*/\.[^.]*\|.*\.\(sh\|java\|php\|jsp\)' -print 2>>${OUTFILE}.err |xargs grep -i \"${KENSAKU_MOJI}\" 1>>${OUTFILE} 2>>${OUTFILE}.err"

echo "[${WHOAMI}@${HOSTNAME}]\$ ${COMMAND}" 1>>${OUTFILE} 2>>${OUTFILE}.err
find ${KENSAKU_DIR} -follow -type f -regex '.*/\.[^.]*\|.*\.\(sh\|java\|php\|jsp\)' -print 2>>${OUTFILE}.err |xargs grep -i "${KENSAKU_MOJI}" 1>>${OUTFILE} 2>>${OUTFILE}.err

exit 0

```

##2 実行のやり方

```shell
#1 フォルダーを作成する（シェルスクリプトのソースに変数WORK_DIRに記載しているフォルダーを作成する）
$ mkdir -p /home/user/rinrin/grep_chousa/result
#2 シェルスクリプトのソースを作成して実行権限を付与する(作成する場所はどこでもいい)
$ cd /home/user/rinrin/grep_chousa/
$ vi grep_jikkou.sh
$ chmod 755 grep_jikkou.sh
#3 引数を指定してシェルスクリプトを実行する
#  第1引数は、検索したいディレクトリ　第2引数は検索したい文字列を指定する
#  以下実行例です
$ ./grep_jikkou.sh /home/user/rinapuri/ 'rinrin'
  
```

##3 一応動作確認を実施しました。（検索するディレクトリは、「/home/user/rinapuri」で検索する文字列は、「rinrin」で実施）

####① 今回検索するアプリのディレクトリの構成とファイル一覧

```shell

#シェルスクリプトのディレクトリ構成
/home/user/rinrin/grep_chousa
                      |-grep_jikkou.sh
                      |-result
                          |-検索結果出力ファイル
                          |-検索結果エラー出力ファイル

#検索するアプリのディレクトリ構成
/home/user/rinapuri
               |-MojiAri.sh
               |-MojiNashi.sh
               |-MojiAri.java  
               |-MojiNashi.java
               |-MojiAri.php
               |-MojiNashi.php
               |-MojiAri.jsp
               |-MojiNashi.jsp
               |-KengenNashi.java ※読み込み権限なしのファイル
               |-MojiAriKakuchoushi.txt ※検索対象外の拡張子（検索文字あり）
               |-MojiNashiKakuchoushi.txt ※検索対象外の拡張子（検索文字なし）
              example
                |-ExMojiAri.sh
                |-ExMojiNashi.sh
                |-ExMojiAri.java  
                |-ExMojiNashi.java
                |-ExMojiAri.php
                |-ExMojiNashi.php
                |-ExMojiAri.jsp
                |-ExMojiNashi.jsp
                |-ExKengenNashi.java ※読み込み権限なしのファイル
                |-ExMojiAriKakuchoushi.txt ※検索対象外の拡張子（検索文字あり）
                |-ExMojiNashiKakuchoushi.txt ※検索対象外の拡張子（検索文字なし）

```

####② 検索するアプリのファイル一覧の権限や中身

```shell
$ pwd
/home/user/rinapuri

#--------------------------権限--------------------------
$ ls -l
total 12
---------- 1 user user  0 Aug 13 09:58 KengenNashi.java
-rw-r--r-- 1 user user 19 Aug 13 09:54 MojiAri.java
-rw-r--r-- 1 user user 15 Aug 13 09:57 MojiAri.jsp
-rw-r--r-- 1 user user 21 Aug 13 09:56 MojiAri.php
-rw-r--r-- 1 user user 19 Aug 13 09:52 MojiAri.sh
-rw-r--r-- 1 user user 25 Aug 13 10:00 MojiAriKakuchoushi.txt
-rw-r--r-- 1 user user 22 Aug 13 09:54 MojiNashi.java
-rw-r--r-- 1 user user 58 Aug 13 09:58 MojiNashi.jsp
-rw-r--r-- 1 user user  0 Aug 13 09:56 MojiNashi.php
-rw-r--r-- 1 user user 18 Aug 13 09:53 MojiNashi.sh
-rw-r--r-- 1 user user 32 Aug 13 10:01 MojiNashiKakuchoushi.txt
drwxr-xr-x 2 user user 13 Aug 13 10:08 example

$ cd example
$ ls -l
total 10
---------- 1 user user  0 Aug 13 10:08 ExKengenNashi.java
-rw-r--r-- 1 user user 19 Aug 13 10:07 ExMojiAri.java
-rw-r--r-- 1 user user 15 Aug 13 10:07 ExMojiAri.jsp
-rw-r--r-- 1 user user 21 Aug 13 10:07 ExMojiAri.php
-rw-r--r-- 1 user user 19 Aug 13 10:07 ExMojiAri.sh
-rw-r--r-- 1 user user 25 Aug 13 10:07 ExMojiAriKakuchoushi.txt
-rw-r--r-- 1 user user 22 Aug 13 10:07 ExMojiNashi.java
-rw-r--r-- 1 user user 58 Aug 13 10:07 ExMojiNashi.jsp
-rw-r--r-- 1 user user  0 Aug 13 10:07 ExMojiNashi.php
-rw-r--r-- 1 user user 18 Aug 13 10:07 ExMojiNashi.sh
-rw-r--r-- 1 user user 32 Aug 13 10:07 ExMojiNashiKakuchoushi.txt

#--------------------------ファイルの中身--------------------------
$ pwd
/home/user/rinapuri
$ cat KengenNashi.java  
cat: KengenNashi.java: Permission denied
$ cat MojiAri.sh
aaa
rinrin
ccc
rin
$ cat MojiAri.java
aaa
rinrin
ccc
rin
$ cat MojiAri.jsp
rinrin
kkkkkkk
$ cat MojiAri.php
ffffff
ggggg
trinrin
$ cat MojiAriKakuchoushi.txt
dddddddd
rinrin ggggggg

$ cat MojiNashi.php
$ cat MojiNashi.sh
aaaa
kkkk
rin
jjj
$ cat MojiNashi.java
cccccc

lllllll
ggggg
$ cat MojiNashi.jsp
fdsfdsfsdfsdfsdfsfddsf
fsdfdsfsdfsdfsdfrrin
gfgdfgsdfgsfg
$ cat MojiNashiKakuchoushi.txt
ffffffffff
lllllllll
nnnnnnnnn

$ cd cd example/

$ cat ExKengenNashi.java
cat: ExKengenNashi.java: Permission denied
$ cat ExMojiAri.sh
aaa
rinrin
ccc
rin
$ cat ExMojiAri.java
aaa
rinrin
ccc
rin
$ cat ExMojiAri.jsp
rinrin
kkkkkkk
$ cat ExMojiAri.php
ffffff
ggggg
trinrin
$ cat ExMojiAriKakuchoushi.txt
dddddddd
rinrin ggggggg

$ cat ExMojiNashi.php
$ cat ExMojiNashi.sh
aaaa
kkkk
rin
jjj
$ cat ExMojiNashi.java
cccccc

lllllll
ggggg
$ cat ExMojiNashi.jsp
fdsfdsfsdfsdfsdfsfddsf
fsdfdsfsdfsdfsdfrrin
gfgdfgsdfgsfg
$ cat ExMojiNashiKakuchoushi.txt
ffffffffff
lllllllll
nnnnnnnnn

```

####③ テスト実行

```shell
$ cd /home/user/rinrin/grep_chousa/
$ chmod 755 grep_jikkou.sh 
$ ./grep_jikkou.sh /home/user/rinapuri 'rinrin'
```

####④ テスト結果確認

```shell
$ cd /home/user/rinrin/grep_chousa/result
$ ls -l
total 2
-rw-r--r-- 1 user user 793 Aug 13 10:49 _home_user_rinapuri.rinrin.20210813104949.txt
-rw-r--r-- 1 user user 134 Aug 13 10:49 _home_user_rinapuri.rinrin.20210813104949.txt.err


$ cat _home_user_rinapuri.rinrin.20210813104949.txt ※実行正常結果
# 【解説】実行コマンド↓↓
[user@project-fb558494-65b0-4172-94b0-83c3ba4e7345]$ find /home/user/rinapuri -follow -type f -regex '.*/\.[^.]*\|.*\.\(sh\|java\|php\|jsp\)' -print 2>>/home/user/rinrin/grep_chousa/result/_home_user_rinapuri.rinrin.20210813104949.txt.err |xargs grep -i "rinrin" 1>>/home/user/rinrin/grep_chousa/result/_home_user_rinapuri.rinrin.20210813104949.txt 2>>/home/user/rinrin/grep_chousa/result/_home_user_rinapuri.rinrin.20210813104949.txt.err
# 【解説】実行結果↓↓
/home/user/rinapuri/MojiAri.sh:rinrin
/home/user/rinapuri/MojiAri.java:rinrin
/home/user/rinapuri/MojiAri.jsp:rinrin
/home/user/rinapuri/MojiAri.php:trinrin
/home/user/rinapuri/example/ExMojiAri.php:trinrin
/home/user/rinapuri/example/ExMojiAri.java:rinrin
/home/user/rinapuri/example/ExMojiAri.jsp:rinrin
/home/user/rinapuri/example/ExMojiAri.sh:rinrin

$ cat _home_user_rinapuri.rinrin.20210813104949.txt.err ※実行エラー結果
grep: /home/user/rinapuri/KengenNashi.java: Permission denied
grep: /home/user/rinapuri/example/ExKengenNashi.java: Permission denied
 
```

##4 一応引数エラーの動作確認も実施しました。

####① テスト実行

```shell
$ cd /home/user/rinrin/grep_chousa/
$ chmod 755 grep_jikkou.sh 
$ ./grep_jikkou.sh /home/user/rinapuri
入力パラメーターの引数が足りません　指定例：grep_jikkou.sh /apuri/souce rinrin
```



##5 egrepコマンドで実行する場合は、今回作成したシェルスクリプトのソースのgrepコマンドの箇所をegrepコマンドに変えて実施する

```shell:egrep_jikkou.sh
#!/bin/bash

WORK_DIR=/home/user/rinrin/grep_chousa
RESULT_DIR=${WORK_DIR}/result

#実行時に指定する引数が2個より小さい場合は入力パラメータエラー
if [ $# -lt 2 ]; then
  echo '入力パラメーターの引数が足りません　指定例：grep_jikkou.sh /apuri/souce 'rinrin' '
  exit 1
fi

KENSAKU_DIR=$1
KENSAKU_MOJI=$2

NOW_TIME=`date +"%Y%m%d%H%M%S"`
OUTFILE=${RESULT_DIR}/`echo "${KENSAKU_DIR}" |sed -e "s/\//_/g"`"."`echo "${KENSAKU_MOJI}" |sed -e "s/\//_/g"`".${NOW_TIME}.txt"
WHOAMI=`whoami`
HOSTNAME=`hostname`
COMMAND="find ${KENSAKU_DIR} -follow -type f -regex '.*/\.[^.]*\|.*\.\(sh\|java\|php\|jsp\)' -print 2>>${OUTFILE}.err |xargs egrep -i \"${KENSAKU_MOJI}\" 1>>${OUTFILE} 2>>${OUTFILE}.err"

echo "[${WHOAMI}@${HOSTNAME}]\$ ${COMMAND}" 1>>${OUTFILE} 2>>${OUTFILE}.err
find ${KENSAKU_DIR} -follow -type f -regex '.*/\.[^.]*\|.*\.\(sh\|java\|php\|jsp\)' -print 2>>${OUTFILE}.err |xargs egrep -i "${KENSAKU_MOJI}" 1>>${OUTFILE} 2>>${OUTFILE}.err

exit 0

```

##6 おわり