셸 스크립트 동작 방식
많은 파일 속에서 특정문자열을 검색
사용되는 명령어
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"
'책 > 모두의 리눅스' 카테고리의 다른 글
[ 책 ] [ 모두의 리눅스 ] 18장 gzip 명령어 : 파일 압축하기 (0) | 2024.04.13 |
---|---|
[ 책 ] [ 모두의 리눅스 ] 18장 tar 명령어: 파일 아카이브 하기 (0) | 2024.04.12 |
[ 책 ] [ 모두의 리눅스 ] 17장 파일 목록 출력하기 (0) | 2024.04.11 |
[ 책 ] [ 모두의 리눅스 ] 17장 셸 스크립트의 장단점 (0) | 2024.04.11 |
[ 책 ] [ 모두의 리눅스 ] 16장 제어구조 : 셸 함수 (0) | 2024.04.10 |