grep 명령어 정리

Ada·2023년 10월 5일
0

자유 공부

목록 보기
14/19

grep 이란?

grep은 리눅스와 UNIX 기반 시스템에서 텍스트 검색을 위해 널리 사용되는 명령어이다.

파일 내에서 특정 문자열 또는 패턴과 일치하는 줄을 찾아 출력해 준다.

grep이란 이름은 "global/regular expression/print"의 약자에서 왔다.

주요 옵션

  • -i: 대소문자 구분 없이 검색

  • -v: 일치하지 않는 줄을 출력 (부정 검색)

  • -r 또는 -R: 디렉터리와 그 하위 디렉터리까지 재귀적으로 검색

  • -l: 일치하는 줄이 있는 파일의 이름만 출력

  • -n: 일치하는 줄과 함께 줄 번호도 출력

  • -e: 여러 패턴을 검색할 때 사용

  • -w: 패턴이 전체 단어와 일치할 때만 결과를 출력

  • -o: 일치하는 패턴만 출력

  • -c: 일치하는 줄의 개수만 출력


예시

  • 특정 단어 검색하기
grep 'apple' filename.txt

  • -i (대소문자 구분 없이 검색)
    파일에서 "APPLE", "Apple", "apple" 모두 일치 항목으로 간주됨
echo -e "apple\nApple\nAPPLE" | grep -i "apple"

//result
apple
Apple
APPLE

  • -v (부정 검색)
    "apple"이라는 단어를 포함하지 않는 모든 줄을 출력함
echo -e "apple\norange\nbanana" | grep -v "apple"

//result
orange
banana

  • -r 또는 -R (재귀적 검색)
    sample_directory 내의 모든 파일 및 하위 디렉터리에서 "apple"을 검색
grep -r "apple" sample_directory/

  • -l (일치하는 문자열이 있는 파일명만 출력)
    "apple"이 포함된 파일들의 이름만 출력
grep -l "apple" file1.txt file2.txt file3.txt

  • -n (줄 번호와 함께 출력)
    "apple"이라는 단어와 그 줄 번호를 함께 출력
echo -e "apple\norange\napple" | grep -n "apple"

//result
1:apple
3:apple

  • -e (여러 패턴 검색)
    "apple" 또는 "orange"를 포함하는 줄을 출력
echo -e "apple\norange\nbanana" | grep -e "apple" -e "orange"

  • -w (전체 단어와 일치)
    "apple"이 독립적인 단어로서만 존재하는 줄을 출력
echo -e "apple\napplepie\nan apple" | grep -w "apple"

//result
apple
an apple

  • -o (일치하는 패턴만 출력)
    "apple" 또는 "orange" 패턴만을 출력
echo "apple and orange" | grep -o "apple\|orange"

++ \|'또는' 이라는 의미의 | 파이프를 사용하기 위해 이스케이프 문자인 \를 앞에 써준 것.
apple\|orange 는 apple 또는 orange 라는 의미

  • -c (일치하는 줄의 개수 출력)
    "apple"을 포함하는 줄의 개수를 출력
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]
profile
백엔드 프로그래머

0개의 댓글