2021. 7. 13. 23:20ㆍLinux
grep은 파일의 내용에서 특정 문자열을 찾고자할 때 사용하는 명령어이다. 최근 회사에서 안드로이드 프로젝트 내 코드에서 특정 형식의 문자열을 찾아서 통계를 내는 기능을 구현할 때 이 grep 명령어를 아주 유용하게 썼다. grep 은 정규표현식도 지원하기 때문에 내가 원하는 문자열을 쉽게 찾을 수 있다.
grep 기본 문법
- PATTERN : 내가 찾고자 하는 문자열
- [FILE...] : 내가 찾고자 하는 문자열을 찾을 파일 또는 디렉토리 경로
grep [OPTION...] PATTERN [FILE...]
grep 맛보기
test.txt 라는 파일 내용은 아래와 같고, 나는 이 test.txt 파일에서 "pizza" 라는 단어를 찾고 싶다! 이 때,
grep "pizza" test.txt 라는 명령어를 치면, 아래처럼 test.txt 내 문장에서 "pizza" 가 포함된 문장을 하이라이트해서 출력해준다!!
OPTION
옵션에는 어떤 것들이 있고, 언제 어떤 옵션을 써야할까?
옵션이... 정~말 저어어어어어엉말 많다 ㅎㅎㅎ;; 이걸 다 어떻게 아냐?!
알 수 없다! 그냥 한번씩 쭉 읽어보고 이런게 있구나~ 하고 넘어가고, 나중에 필요할 때 적절히 찾아쓰면 된다. 😇
-E | PATTERN을 확장 정규 표현식(Extended RegEx)으로 해석 |
-F | PATTERN을 정규 표현식(RegEx)이 아닌 일반 문자열로 해석 |
-G | PATTERN을 기본 정규 표현식(Basic RegEx)으로 해석 |
-P | PATTERN을 Perl 정규 표현식(Perl RegEx)으로 해석 |
-e | 매칭을 위한 PATTERN 전달 |
-f | 파일에 기록된 내용을 PATTERN으로 사용 |
-i | 대/소문자 무시 |
-v | 매칭되는 PATTERN이 존재하지 않는 라인 선택 |
-w | 단어(word) 단위로 매칭 |
-x | 라인(line) 단위로 매칭 |
-z | 라인을 newline(\n)이 아닌 NULL(\0)로 구분 |
-m | 최대 검색 결과 개수 제한 |
-b | 패턴이 매치된 각 라인의 바이트 옵셋 출력 |
-n | 검색 결과 출력 라인 앞에 라인 번호 출력 |
-H | 검색 결과 출력 라인 앞에 파일 이름 표시 |
-h | 검색 결과 출력 시, 파일 이름 무시 |
-o | 매치되는 문자열만 표시 |
-q | 검색 결과 출력하지 않음 |
-a | 바이너리 파일을 텍스트 파일처럼 처리 |
-I (대문자 i) | 바이너리 파일은 검사하지 않음 |
-d | 디렉토리 처리 방식 지정 (read, recurse, skip) |
-D | 장치 파일 처리 방식 지정 (read, skip) |
-r | 하위 디렉토리 탐색 |
-R | 심볼릭 링크를 따라가며 모든 하위 디렉토리 탐색 |
-L | PATTERN이 존재하지 않는 파일 이름만 표시 |
-l (소문자 L) | 패턴이 존재하는 파일 이름만 표시 |
-c | 파일 당 패턴이 일치하는 라인의 개수 출력 |
grep 의 다양한 사용 예시
🧤 특정 파일이 아닌, 디렉토리 내에 있는 모든 하부 디렉토리와 파일에서 검색하고 싶어!
그렇다면 -r 옵션을 사용하자.
grep -r "pizza" ./*
-r 옵션을 사용하지 않으면 아래와 같은 오류를 만나게 된다.
grep "pizza" ./*
# 결과: 아래와 같은 오류 발생!
grep: ./IdeaProjects: Is a directory
🧤 검색 결과 출력 시, 파일 이름은 나오지 않았으면 좋겠어!
그렇다면 -h 옵션을 사용하자.
grep -h "pizza" ./*
🧤 매칭되는 문자열만 출력되었으면 좋겠어!
그렇다면 -o 옵션을 사용하자.
grep -o "pizza" test.txt
# 출력 결과
pizza
pizza
🧤 대소문자 구분없이 PATTERN 에 해당하는 문자열을 찾고 싶어!
그렇다면 -i 옵션을 사용하자.
예를 들어, "pizza" 라는 단어를 대소문자 구분없이 찾고 싶을 때. 즉, "Pizza", "PIZZA" 등이 포함된 문자열을 모두 검색하고 싶을 때!
grep -i "pizza" ./*
🧤 특정 디렉토리는 제외하고 검색하고 싶어!
그렇다면 --exclude-dir='디렉토리 명' 을 사용하자.
예를 들어, 현재 경로의 모든 하부 디렉토리에서 검색하되, dev 라는 디렉토리는 제외하고 검색하고 싶다면,
grep -r --exclude-dir='dev' "pizza" ./*
🧤 정규표현식을 사용하여 문자열을 검색하고 싶어!
그렇다면 -E 또는 -G 옵션을 사용하자.
예를 들어 "todo " 또는 "todo:" 형식의 문자열을 찾고 싶을 때,
grep -E "todo( |:)" ./*
🧤 Negative Lookahead 정규표현식을 사용하여 문자열을 검색하고 싶어!
grep 에서 Regular expression negative lookahead 를 사용하고 싶다면 Perl 정규표현식을 사용해야 한다.
따라서 -P 옵션을 사용하자.
이 때, 위에서 정규표현식을 사용하기 위해 사용한 -E 또는 -G 옵션과는 같이 사용할 수 없다!
예를 들어, "todo"가 포함된 문자열 중 "todo@" 형식의 문자열을 제외하고 찾고 싶다면,
grep -P 'todo(?!(@))' ./*
단, 특정 grep 버전에서는 -P 옵션이 지원되지 않는 듯 하다. 필자의 개인 맥북의 경우, grep 2.5.1 버전인데 -P 옵션이 먹지 않았다... 슬프게도...
TIP. grep 결과를 배열(array) 로 담고 싶을 때 !!!!!
grep 으로 찾은 결과를 배열에 담아 for 문을 돌린다던지 등의 니즈가 있을 것이다. 그럴 땐 바로 👇👇👇
grep_result_list=($(grep -ro "pizza" ./*))
이로써 유용하게 사용한 grep 의 예시는 여기까지! 앞으로 다른 유용한 케이스들이 생기면 바로 업데이트할 예정이다.
grep 짱 !!!!
'Linux' 카테고리의 다른 글
[Shell Script] 배열(array)과 Map 사용하기 (0) | 2021.07.12 |
---|---|
[Shell Script] 기본 문법 알아보기 - if 문, for 문 (0) | 2021.07.11 |