Linux - grep 명령어 사용법 (리눅스 문자열 검색하기)
💡 1. grep 명령어의 개념
grep은 입력으로 전달된 파일의 내용에서 특정 문자열을 찾고자할 때 사용하는 명령어이다.
하지만 grep 명령어가 문자열을 찾는 기능을 수행한다고 해서, 단순히 문자열이 일치하는지 여부만을 검사하는 것은 아니다.
문자열이 같은지(equal)만을 검사하는 수준을 넘어, 훨씬 복잡하고 다양한 방식으로, 그리고 매우 효율적으로 문자열을 찾는 기능을 제공한다.
이는 grep이 파일의 문자열을 검색할 때, 단순 문자열 매칭이 아니라, 정규 표현식(Regular Expression)에 의한 패턴 매칭(Pattern Matching) 방식을 사용하기 때문이다.
📌 정규 표현식(Regular Expression)
정규 표현식이란, 특정 규칙을 가진 문자열 집합을 표현하기 위한 형식 언어로써, 주로 문자열 패턴 매칭을 검사하거나 또는 문자열을 치환하기 위해 사용된다.
문자열 검색에 정규 표현식을 적용하면, 지정된 문자열의 문자가 단순히 "같은지" 여부가 검사되는 것이 아니라, 정규 표현식의 규칙에 매칭(Matching)되는지 여부가 검사된다.
ex) 단순 문자열 검색에서 "*"은 문자 그대로 "*"을 의미하기 때문에 ( "*" == "*" ) 은 성립하지만 ( "A" == "*" )는 성립하지 않는다. 하지만 정규 표현식에서 "*"은 0개 이상의 모든 문자를 의미하므로, ( "*" == "*" ) 뿐만 아니라 ( "A" == "*" )도 TRUE로 판단한다.
💡 2. grep 명령어 옵션
grep 명령에서 사용할 수 있는 옵션은 아래와 같습니다.
grep [OPTION...] PATTERN [FILE...]
-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 : 패턴이 매치된 각 라인(-o 사용 시 문자열)의 바이트 옵셋 출력.
-n : 검색 결과 출력 라인 앞에 라인 번호 출력.
-H : 검색 결과 출력 라인 앞에 파일 이름 표시.
-h : 검색 결과 출력 시, 파일 이름 무시.
-o : 매치되는 문자열만 표시.
-q : 검색 결과 출력하지 않음.
-a : 바이너리 파일을 텍스트 파일처럼 처리.
-I : 바이너리 파일은 검사하지 않음.
-d : 디렉토리 처리 방식 지정. (read, recurse, skip)
-D : 장치 파일 처리 방식 지정. (read, skip)
-r : 하위 디렉토리 탐색.
-R : 심볼릭 링크를 따라가며 모든 하위 디렉토리 탐색.
-L : PATTERN이 존재하지 않는 파일 이름만 표시.
-l : 패턴이 존재하는 파일 이름만 표시.
-c : 파일 당 패턴이 일치하는 라인의 갯수 출력.
💡 3. grep 명령 사용 예제
grep을 사용하여 파일로부터 문자열을 검색하는 방법은 아래와 같습니다.
# grep 명령어 사용방법 $ grep [OPTION] [PATTERN] [FILE]
아래는 "grep.txt"의 내용에서 "Linux"라는 문자열을 검색(기본적으로 대소문자 구분)하고, 문자열이 존재하는 라인을 출력하는 예제입니다.
자주 사용하는 grep 명령어 사용 예제는 아래와 같습니다.
grep 사용 예 | 명령어 옵션 |
대상 파일에서 문자열 검색 | grep "STR" [FILE] |
현재 디렉토리 모든 파일에서 문자열 검색 | grep "STR" * |
특정 확장자를 가진 모든 파일에서 문자열 검색 | grep "STR" *.txt |
대소문자 구분 없이 문자열 검색 | grep -i "STR" [FILE] |
매칭되는 패턴이 존재하지 않는 라인 선택 | grep -v "STR" [FILE] |
단어 단위로 문자열 검색 | grep -w "STR" [FILE] |
검색된 문자열이 포함된 라인 번호 출력 | grep -n "STR" [FILE] |
하위 디렉토리를 포함한 모든 파일에서 문자열 검색 | grep -r "STR" * |
최대 검색 결과 갯수 제한 | grep -m 100 "STR" [FILE] |
검색 결과 앞에 파일 이름 표시 | grep -H "STR" * |
문자열 A로 시작하여 문자열 B로 끝나는 패턴 찾기 | grep "A.*B" * |
0-9 사이 숫자만 변경되는 패턴 찾기 | grep "STR[0-9]" * |
문자열 패턴 전체를 정규 표현식 메타 문자가 아닌 일반 문자로 검색 | grep -F "*[]?..." [FILE] |
정규 표현식 메타 문자를 일반 문자로 검색 | grep "\*" [FILE] |
문자열 라인 처음 시작 패턴 검색 | grep "^STR" [FILE] |
문자열 라인 마지막 종료 패턴 검색 | grep "$STR" [FILE] |
📌 3-1 대상 파일에서 문자열 검색
grep 명령에 문자열과 파일 이름을 지정하여, 파일에서 문자열을 검색할 수 있습니다.
이 때 문자열 검색 결과는 문자열이 포함된 라인 단위로 출력됩니다.
$ grep "STR" FILE1.txt > FILE.txt에서 "STR" 문자열 검색.
📌 3-2 현재 디렉토리 모든 파일에서 문자열 검색
파일 이름에 "*" 문자를 사용하여, 현재 디렉토리에 있는 모든 파일에서 문자열을 검색할 수 있습니다.
단, 현재 디렉토리에 포함된 하위 디렉토리에 있는 파일은 탐색하지 않습니다. (하위 디렉토리를 탐색하려면 -r 옵션 사용.)
$ grep "STR" * > 현재 디렉토리 모든 파일에서 "STR" 문자열 검색.
📌 3-3 특정 확장자를 가진 모든 파일에서 문자열 검색
파일 이름 확장자 앞에 "*" 문자를 사용하여, 특정 확장자를 가진 모든 파일에서 문자열을 검색할 수 있습니다.
$ grep "STR" *.txt > txt 확장자를 가진 파일에서 "STR" 문자열 검색.
📌 3-4 대소문자 구분하지 않고 문자열 검색
grep 명령에 "-i" 옵션을 사용하여, 대소문자 구분없이 문자열을 검색할 수 있습니다.
grep -i "STR" FILE.txt > FILE.txt 파일에서 대소문자 구분없이(STR, str) 문자열 검색.
📌 3-5 매칭되는 PATTERN이 존재하지 않는 라인 선택
어떤 경우에는, 문자열이 매칭되는 라인이 아닌, 매칭되는 패턴이 존재하지 않는 라인을 선택해야 하는 경우가 있습니다.
이 때, "-v" 옵션을 사용합니다.
grep -v "STR" FILE.txt > FILE.txt 파일에서 "STR"이 포함되지 않은 라인 표시.
📌 3-6 단어(Word) 단위로 문자열 검색
"-w" 옵션을 사용하면, 단어(Word) 단위로 문자열을 검색할 수 있습니다.
grep -w "STRING" FILE.txt > FILE.txt 파일에서 "STRING"이라는 문자열(단어 단위) 검색.
📌 3-7 검색된 문자열이 포함된 라인 번호 출력
"-n" 옵션을 사용하여, 검색 결과가 포함된 라인 번호를 출력할 수 있습니다.
grep -n "STR" FILE.txt > "STR"이 포함된 라인 번호 출력.
📌 3-8 하위 디렉토리를 포함한 모든 파일에서 문자열 검색
"-r" 옵션을 사용하면, 하위 디렉토리를 포함한 모든 파일에서 문자열을 검색할 수 있습니다.
grep -r "STR" * > "STR"이 포함된 라인 번호 출력.
📌 3-9 최대 검색 결과 갯수 제한
grep 명령의 결과가 너무 많이 표시될 때, "-m" 옵션을 사용하여 최대 표시 결과를 제한할 수 있습니다.
grep -m 100 "STR" FILE.txt > FILE.txt 파일에서 문자열 "STR"이 포함된 결과를 100개까지만 표시.
📌 3-10 검색 결과 앞에 파일 이름 표시
"-H" 옵션을 사용하여 검색 결과 앞에 파일 이름을 표시할 수 있습니다.
grep -H "STR" * > "STR"이 포함된 파일 이름 표시. grep -Hn "STR" * > "STR"이 포함된 파일 이름과 라인 번호 표시.
📌 3-11 문자열 A로 시작하여 문자열 B로 끝나는 패턴 찾기
정규 표현식에서 "."와 "*"를 조합하여 문자열 A로 시작하여 문자열 B로 끝나는 패턴을 찾을 수 있습니다.
grep "the.*step" * > "the"로 시작하여 "step"으로 끝나는 패턴 검색. grep "A.*Z" * > "A"로 시작하여 "Z"로 끝나는 패턴 검색.
📌 3-12 [0-9] 사이 숫자만 변경되는 패턴 찾기
정규 표현식 "[]"를 사용하여 0-9 사이 숫자만 변경되는 문자열 패턴을 검색할 수 있습니다.
grep step[0-9] * > "step0", "step1", ..., "step9" 패턴을 검색.
📌 3-13 문자열 패턴 전체를 정규 표현식 메타 문자가 아닌 일반 문자로 검색하기
"-F" 옵션을 사용하면, 패턴에 지정된 문자열을 메타 문자로 인식하지 않고 일반 문자로 인식하여 패턴을 검색합니다.
grep -f "[0-9]" * > "[0-9]" 문자열 검색.
📌 3-14 정규 표현식 메타 문자를 일반 문자로 검색하기
문자열 패턴에서 정규 표현식 메타 문자 앞에 "\"(백슬래시)를 사용하면, 해당 문자를 일반 문자로 인식하게 만들 수 있습니다.
grep "\*" FILE.txt > FILE.txt 파일에서 * 문자 검색. grep "\." FILE.txt > FILE.txt 파일에서 . 문자 검색.
📌 3-15 문자열 라인의 처음 시작 패턴 검색하기
정규 표현식 "^"를 사용하여 문자열 라인의 중간이 아닌 시작 패턴만 검색할 수 있습니다.
grep "^C" FILE.txt > FILE.txt 에서 C로 시작하는 라인 검색. grep "^1" FILE.txt > FILE.txt 에서 "1"으로 시작하는 라인 검색.
📌 3-16 문자열 라인 마지막 종료 패턴 검색하기
정규 표현식 "$"를 사용하여 문자열 라인의 처음 또는 중간이 아닌 종료 패턴을 검색할 수 있습니다.
grep "\.$" FILE.txt > FILE.txt "." 으로 끝나는 라인 검색. grep -v "\.$" FILE.txt > FILE.txt "." 으로 끝나지 않는 라인 검색.
이상 Linux - grep 명령어에 대한 포스팅을 마치겠습니다.
출처
https://coding-factory.tistory.com/802
https://recipes4dev.tistory.com/m/157
'Programming > Linux' 카테고리의 다른 글
[Linux] ssh와 rlogin의 차이 (0) | 2023.12.29 |
---|---|
[Linux] 파일, 디렉토리 삭제 rm 명령어 사용법 (0) | 2023.05.09 |
[Linux] 리눅스 설치 없이 실습하는 방법 (cloud9, codeOnWeb) (0) | 2023.05.09 |
[Linux] 리눅스 find 명령어 사용법 및 예제 - 파일, 디렉토리 검색 (2) | 2021.06.23 |