이 가이드에서는 grep 유틸리티를 사용해 여러 단어, 문자열, 그리고 패턴을 동시에 검색하는 방법을 설명합니다. 아래에서 각 작업을 수행하는 데 필요한 전체 명령어 예제를 확인할 수 있습니다.
Grep이란?
여기서 말하는 grep은 명령줄(command-line) 기능을 의미합니다. grep은 'Global Regular Expression Print'의 약자로, 입력 파일에서 특정 정규 표현식과 일치하는 줄을 찾아낸 뒤, 해당 줄들을 표준 출력(standard output)으로 출력하는 도구입니다.
grep 유틸리티는 세 가지 표현식 문법을 지원합니다. 기본(Basic), 확장(Extended), Perl 호환(Perl-compatible) 방식이 그것입니다. 별도의 정규 표현식 문법을 지정하지 않으면 GNU grep은 검색 패턴을 기본 표현식으로 처리합니다.
여러 패턴 검색하기
여러 패턴을 동시에 검색하려면 OR 연산자, 즉 교대(alternation) 연산자를 사용하면 됩니다. 이 연산자는 파이프 문자인 | 입니다.
이 연산자를 사용하면 표현식 집합이든 리터럴 문자열이든 모든 가능한 일치 항목을 지정할 수 있습니다. 따라서 여러 패턴을 검색하려면 다음과 같이 입력합니다.
$ grep 'first pattern\|second pattern' filename
'first pattern'과 'second pattern' 자리에는 실제로 검색하고자 하는 패턴을 넣으면 됩니다. 이 정규 표현식('first pattern\|second pattern')은 항상 작은따옴표로 감싸야 합니다. 파이프 기호가 교대 연산자로 인식되지 않기 때문에, grep에게 파이프를 다르게 해석하도록 지시하기 위해 이스케이프(백슬래시) 문자가 필요합니다.
패턴을 확장 정규 표현식으로 지정하려면 '-e' 또는 '--extended-regexp' 옵션을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
$ grep -E 'first pattern|second pattern' filename
확장 정규식에서는 파이프를 이스케이프할 필요가 없습니다.
파일을 지정해서 검색할 수도 있으므로, presentation.txt 파일 내에서 패턴을 검색한다면 다음과 같습니다.
$ grep -E 'first pattern|second pattern' presentation.txt
출력 결과에는 검색한 문자열이 하이라이트되어 표시됩니다.
검색 대상 파일이 다른 디렉터리에 있다면, 전체 파일 경로를 지정해 grep에게 해당 디렉터리를 검색하도록 알려주어야 합니다. 예를 들면 다음과 같습니다.
$ grep -E 'first pattern|second pattern' /home/presentation.txt
여러 문자열 검색하기
가장 기본적인 패턴은 리터럴 문자열입니다. 여러 문자열을 검색하려면 grep 명령어 뒤에 해당 문자열들을 나열하면 됩니다. 예를 들어 'one', 'two', 'three'를 검색한다고 가정하면 다음과 같습니다.
$ grep 'one\|two\|three'
명령어 뒤에 검색할 파일 이름을 붙이면 됩니다. 확장 정규 표현식을 사용한다면 사실상 '\'만 제거하면 됩니다. 예를 들면 다음과 같습니다.
$ grep -E 'one|two|three'
대소문자 구분 무시하기
grep 명령어는 기본적으로 대소문자를 구분합니다. 대소문자 구분을 무시하려면 '-i' 또는 '--ignore-case' 옵션을 사용하세요. 예를 들면 다음과 같습니다.
$ grep -i 'one\|two\|three'
일치 횟수 세기
로그 파일을 분석할 때 경고(warning)와 오류(error) 메시지 수가 증가했는지 확인하고 싶지만 상세 결과까지는 볼 필요가 없다면 '-c' 옵션을 사용하면 됩니다. myapp.log 파일 내에서 여러 패턴의 일치 횟수를 세려면 다음과 같이 입력합니다.
grep -c 'one\|two\|three' /var/log/myapp.log
특정 파일 형식에서 여러 패턴 검색하기
특정 파일 형식에 대해서만 여러 문자열을 검색할 수도 있습니다. 예를 들어 디렉터리 안의 모든 텍스트 파일이나 모든 로그 파일을 대상으로 검색하는 것이 가능합니다. 파일 이름 대신 파일 확장자와 함께 애스터리스크(*)를 사용하면 됩니다. 앞선 오류 메시지 예제를 활용해 모든 로그 파일을 검색한다면 다음과 같습니다.
grep -c 'one\|two\|three' /var/log/*.log
재귀적으로 여러 패턴 검색하기
애스터리스크를 사용하면 grep은 현재 지정된 경로 내에서만 검색합니다. 모든 하위 디렉터리까지 포함해야 한다면 '-R' 옵션을 사용하세요.
grep -R 'one\|two\|three' /var/log/*.log
이렇게 하면 지정된 var/log/ 디렉터리와 그 하위 디렉터리에 있는 모든 파일에 대한 검색 결과가 반환됩니다.
정확히 일치하는 단어만 검색하기
grep 명령어는 완전히 일치하는 경우뿐 아니라 문자열이 포함된 모든 결과를 표시합니다. 예를 들어 'value'를 검색하면 'values'나 'valued'가 포함된 줄도 함께 출력됩니다. 단어 전체와 정확히 일치하는 줄만 반환하려면 '-w' 또는 '--word-regexp' 옵션을 사용하세요. 'one', 'two', 'three'와 정확히 일치하는 항목을 검색한다면 다음과 같습니다.
$ grep -w 'one\|two\|three'
여기서 말하는 단어 문자(word character)에는 영숫자(0-9, a-z)와 언더스코어(_)가 포함되며, 그 외의 문자는 모두 비단어 문자로 간주됩니다.