grep은 리눅스와 UNIX 기반 시스템에서 텍스트 검색을 위해 널리 사용되는 명령어이다.
파일 내에서 특정 문자열 또는 패턴과 일치하는 줄을 찾아 출력해 준다.
grep
이란 이름은 "global/regular expression/print"의 약자에서 왔다.
-i: 대소문자 구분 없이 검색
-v: 일치하지 않는 줄을 출력 (부정 검색)
-r 또는 -R: 디렉터리와 그 하위 디렉터리까지 재귀적으로 검색
-l: 일치하는 줄이 있는 파일의 이름만 출력
-n: 일치하는 줄과 함께 줄 번호도 출력
-e: 여러 패턴을 검색할 때 사용
-w: 패턴이 전체 단어와 일치할 때만 결과를 출력
-o: 일치하는 패턴만 출력
-c: 일치하는 줄의 개수만 출력
grep 'apple' filename.txt
echo -e "apple\nApple\nAPPLE" | grep -i "apple"
//result
apple
Apple
APPLE
echo -e "apple\norange\nbanana" | grep -v "apple"
//result
orange
banana
grep -r "apple" sample_directory/
grep -l "apple" file1.txt file2.txt file3.txt
echo -e "apple\norange\napple" | grep -n "apple"
//result
1:apple
3:apple
echo -e "apple\norange\nbanana" | grep -e "apple" -e "orange"
echo -e "apple\napplepie\nan apple" | grep -w "apple"
//result
apple
an apple
echo "apple and orange" | grep -o "apple\|orange"
++ \| 는 '또는' 이라는 의미의 | 파이프를 사용하기 위해 이스케이프 문자인 \를 앞에 써준 것.
apple\|orange 는 apple 또는 orange 라는 의미
echo -e "apple\norange\napple" | grep -c "apple"
//result
2
grep "g111" | grep "entry"
이렇게 검색하면 결과가 출력되지 않는다.
grep "g111" 의 대상이 명시되지 않았기 때문에 grep 은 표준 입력을 대상으로 "g111" 문자열을 기다리지만, 이 경우에 표준 입력이 없었기 때문에 아무런 결과도 나오지 않는다.
이럴 경우, grep "g111" * | grep "entry"
이런 식으로 첫 번째 grep 의 대상을 지정하면 된다.
반면에, 와일드 카드(*) 가 꼭 필요하지 않은 경우도 있다.
표준 입력을 먼저 출력하는 것이다.
// 특정 파일에서 두 패턴 검색하기
cat filename.txt | grep "g111" | grep "entry"
// 다른 명령어의 출력에서 두 패턴 검색하기
dmesg | grep "error" | grep "disk"
작은 따옴표 안에 있는 문자들은 그대로의 문자로 간주된다.
즉, 변수나 이스케이프 문자가 확장되거나 해석되지 않는다.
예: echo '$HOME' -> 출력은 $HOME 문자열 그대로이다.
큰 따옴표 안에 있는 문자들 중에서 $, \, !(특정 셸에서) 등의 문자들은 특별한 의미로 해석된다.
즉, 변수는 그 값으로 확장되고, 이스케이프 문자는 해당하는 문자로 해석된다.
예: echo "$HOME" -> 출력은 사용자의 홈 디렉터리 경로이다.
grep 명령어와 같은 경우에는 대부분 작은 따옴표를 사용하여 정규 표현식이나 패턴 내의 특별한 문자들이 셸에 의해 해석되는 것을 방지한다.
하지만, 변수 확장이 필요한 경우에는 큰 따옴표를 사용할 수 있다.
기능 | 사용법 |
---|---|
대상 파일에서 문자열 검색 | grep "STR" [FILE] |
현재 디렉토리 모든 파일에서 문자열 검색 | grep "STR" * |
특정 확장자를 가진 모든 파일에서 문자열 검색 | grep "STR" *.ext |
대소문자 구분하지 않고 문자열 검색 | grep -i "STR" [FILE] |
매칭되는 PATTERN이 존재하지 않는 라인 선택 | grep -v "STR" [FILE] |
단어(Word) 단위로 문자열 검색 | 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] |