셸 스크립트 동작 방식

많은 파일 속에서 특정문자열을 검색

 

사용되는 명령어

xargs

- 표준 입력으로 인자의 리스트를 받는 명령어

- 주로 find,  grep 과 조합을 하여 많은 파일에서 문자열을 검색하는 용도로 사용

- xargs < 실행하고 싶은 명령어> 방식

- < 실행하고 싶은 명령어> 가 표준입력으로 전달 받은 리스트를 인자로 실행

$ find . -type f -name '*.txt' | xargs ls -l

 - txt 타입의 파일 목록을 출력 →  출력된 리스트를 인자로 받아 실행

 

스크립트 예시

#!/bin/bash

pattern=$1
find . -type f | xargs grep "$pattern" 

 

위의 스크립트의 단점은

- find 에서 한 개의 결과가 나오면 파일이 이름이 출력이 되지 않는 다는 점 →  H 옵션 필요

- 파일에서 "pattern" 을 찾은 위치를 알 수 없다는 점  → n 옵션 필요

 

#!/bin/bash

pattern=$1
find . -type f | xargs grep  -nH "$pattern" 

 

좀 더 개선을 해보자

이 스크립트를 매번 검색할 디렉터리로 가서 실행해야하는 불편 → 디렉터리 지정 추가

검색하는 파일의 타입이 고정되어 있다는 불편함 → 파일타입 지정 추가

 

findgrep.sh

#!/bin/bash

pattern=$1
directory=$2
filetype=$3

if [ -z "$directory" ]; then
   directory='.'
fi

if [ -z "$filetype" ]; then
  filetype'*'
fi

find "$directory"  -type f -name "$filetype" | xargs grep  -nH "$pattern" 

 

사용 예시

$ findgrep.sh ldk "home" '*.txt'

 

 

도움말 / 사용법 표시

아래 코드를 findgrep.sh 상단에 추가

usage()
{
    #  셸 스크립트의 파일 이름을 취득
    local script_name=$(basename "$0")
    
    #도움말 표시
    cat << END

    Usage : $ script_name PATTERN [PATH] [NAME_PATTERN]
    Find file in currernt directory recursively, and print lines which match PATTERN

        PATH                        find file in PATH directory, instead of current directory
        NAME_PATTERN    specify name pattern to find file

    Examples:
        $ script_name return
        $ script_name return ~ '*.txt'
   
    END
}

if [ "$#" -eq 0 ]; then
    usage
    exit 1
fi

.... 코드

 

- cat << : here document 라고 하여 여러 행의 텍스트를 셸 스크립트에서 그대로 기술 하고 싶을 때 사용

 

에러 표시

......

# 검색 디렉토리가 존재 하지 않을 때 에러 메세지 출력하고 종료
if [ ! -d "$directory" ]; then
    echo "$0: ${directory} : No such directory" 1>&2
    exit 2
fi

 

 

최종 파일

#!/bin/bash

# 사용 방법
usage()
{
    #  셸 스크립트의 파일 이름을 취득
    local script_name=$(basename "$0")
    
    #도움말 표시
    cat << END

    Usage : $ script_name PATTERN [PATH] [NAME_PATTERN]
    Find file in currernt directory recursively, and print lines which match PATTERN

        PATH                        find file in PATH directory, instead of current directory
        NAME_PATTERN    specify name pattern to find file

    Examples:
        $ script_name return
        $ script_name return ~ '*.txt'
   
    END
}

if [ "$#" -eq 0 ]; then
    usage
    exit 1
fi

# 검색 함수 
pattern=$1
directory=$2
filetype=$3

if [ -z "$directory" ]; then
   directory='.'
fi

if [ -z "$filetype" ]; then
  filetype'*'
fi

# 검색 디렉토리가 존재 하지 않을 때 에러 메세지 출력하고 종료
if [ ! -d "$directory" ]; then
    echo "$0: ${directory} : No such directory" 1>&2
    exit 2
fi

find "$directory"  -type f -name "$filetype" | xargs grep  -nH "$pattern" 

+ Recent posts