ETC

ShellScript - 파일내 Keyword 검색 (find, xargs, grep|egrep)

MuGrammer 2011. 7. 20. 08:34
파일 내 검색해야 할 Keyword도 많고..
검색해야 할 파일도 많고.. 
또 그 결과를 키워드 별로 구분도 해야 하고.. 
하나하나씩 find 명령어를 실행시켜 검색을 하기가 껄끄러워 쉘 스크립트를 만들어 보았다.

몇 줄 안되지만 ShellScript 보기만 했지 직접 만들어보니.. 여간 힘들었다.


1. Make Keyword List
   - '내가 키워드 목록이다' 라고 구분할 수 있는 의미있는 확장자를 가지게 한다.
   ex) MykeywordList.kwd
   - 키워드 목록 내용은 별다른게 없다 아래와 같이 키워드를 '한줄 한줄' 구분해주면 된다. 
  
apple
iphone
what

2. Config
스크립트가 너무 길어지는걸 방지하기 위해 필요한 변수들을 환경변수처럼 만들었다.
#경로지정
a_path="/a"
b_path="/b"

3. ShellScript
#!/bin/ksh
 
SCRIPT_PATH=`pwd`

#설정파일을 import 시킨다. 

. $SCRIPT_PATH/config

echo $a_path

#kwd 파일 목록을 불러온다.
file_list=`ls *.kwd`
 
#순차적으로 kwd 파일의 내용을 읽어와 대상 경로의 파일들을 대상으로
#keyword와 매칭되는 파일들을 검색한다.

for current_file in $file_list
do
#현재 kwd 파일의 내용, 즉 keyword들을 list 변수에 담는다.
list=`cat $SCRIPT_PATH/$current_file`

#keyword별로 대상 경로의 파일들에 해당 내용이 포함되어있는지 검색한다.  
# find [경로] -name [이름] | xargs grep [keyword]
for current in $list
do
# 해당 경로에 있는 xml 파일을 대상으로 [.keyword"]가 포함된 파일을 찾는다.
        echo "find $a_path -name '*.xml' | xargs grep '.*[.]$current\"'"
        maplist=`find $a_path -name '*.xml' | xargs grep .*[.]$current\"`
 
#검색된 내용을 중 필요한 항목만을 추출하여 파일에 기록한다.
        for current_map in $maplist
        do
        yn=`echo $current_map | grep xml`
        if [ $yn ]
        then
                temp=${current_map#*$map_path}
                mapname=${temp%%.xml*}
                echo $mapname
                echo ${mapname##*/} >> $current_file.map 
        fi

        yn=`echo $current_map | grep .*[.]$current`

        if [ $yn ]
        then
                temp=${current_map%\"*}
                keyword=${temp##*\"}
                echo "keyword" $keyword 
                echo $current   $mapname        $keyword >> $current_file.rslt
        fi              
        done
done
 done

검색내용 추출부분은 필요에 의해 작성한거라 크게 신경쓸 필욘 없다.
단, 변수의 내용을 조작(?) 하는 부분은 유용하게 쓰이는 부분이라 숙지하여야 할 필요가 있다.

예제 설명
${variable:-default} 변수가존재하지 않으면 default로 대체한다.
${#variable} variable의 length를 얻는다.
${variable%word} variable의 끝에서부터 word와 첫번째로 일치하는 부분을 제거한다.
${variable variable의 끝에서부터 word와 마지막으로 일치하는 부분을 제거한다.
${variable#word} variable의 시작에서부터 word와 첫번째로 일치하는 부분을 제거한다.
${variable##word} variable의 시작에서부터 word와 마지막으로 일치하는 부분을 제거한다.

출처 : http://www.insford.com/wiki/Wiki.jsp?page=Shell%20Script

위 사이트에 ShellScript에 대한 기본적인 내용이 잘 정리되어 있어 참고하시길 바랍니다.

참고로 아래의 find 문은 파일명에 공백이 포함되어 있을시 파일내용을 검색 할 수 있다.

** 공백이 포함되어 있을시 공백단위로 파일명이 구분되어 정상적으로 파일의 내용을 검색할 수 없다.

find [path] -type f | sed -e s/^/\"/ -e s/$/\"/ | xargs egrep [Keyword]

4. 기타
아직 정규식에 대해 많은 내용을 알고 있진 않지만 grep에 정규식을 활용하여 많은 정보를 획득 할 수 있다는 사실을 알게 되었다.
그리고 sed 에 대해서도 충분한 지식이 있으면 다양한 방면으로 활용이 가능 할 것 같다.

다음엔 정규식과 sed 에 관련한 내용을 공부한 다음 포스팅을 해야겠다.



반응형

'ETC' 카테고리의 다른 글

su - 와 su의 차이  (0) 2011.08.22
WebLogic 설치  (0) 2011.08.11
[HP-UX] java 버전 확인  (0) 2011.08.11
ALBD network connection errors in log on the client machine  (0) 2011.07.22
MAN - DATE  (0) 2011.07.04