본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/리눅스

[linux] grep 사용방법, grep이 무엇인가?

by 미노드 2023. 7. 12.

grep은 입력으로 전달된 파일의 내용에서 특정 문자열을 찾고자할 때 사용하는 명령어입니다.
무언갈 찾는데 있어 find와 기능이 유사하지만, find는 파일명/폴더명을 검색하는데 사용합니다.

특히나 find의 결과나 다른 명령어의 결과를 입력으로 받은 뒤,
입력 값 중에서 특정 문자열을 찾는데 파이프( | ) 로 연결한 뒤 grep 을 사용하는 식입니다.
자주 사용되는 기능이므로 알아둬야 하는 기능 중 하나이지만, 별도로 심화학습을 위해 정리해둡니다.

grep 명령어가 문자열을 찾는 기능을 수행한다고 해서, 단순히 문자열이 일치하는지 여부만을 검사하는 것은 아닙니다.
더욱 복잡하고 다양한 방식으로, 그리고 효율적으로 문자열을 찾는 기능을 제공합니다.
이는 grep이 파일의 문자열을 검색할 때, 단순 문자열 매칭이 아니라,
정규 표현식(Regular Expression)에 의한 패턴 매칭(Pattern Matching) 방식을 사용하기 때문입니다.

1. 정규 표현식(Regular Expression)

정규 표현식(Regular Expression)이란, 특정 규칙을 가진 문자열 집합을 표현하기 위한 형식 언어로써, 주로 문자열 패턴 매칭을 검사하거나 또는 문자열을 치환하기 위해 사용됩니다.

문자열 검색에 정규 표현식을 적용하게 되면, 지정된 문자열의 문자가 단순히 "같은지(equal)" 여부가 검사되는 것이 아니라, 정규 표현식의 규칙에 매칭(Matching)되는지 여부가 검사됩니다.

예를 들어, 단순 문자열 검색에서 '*'은 문자 그대로 '*'을 의미하기 때문에
('*' == '*')은 성립하지만 ('A' == '*')는 성립하지 않습니다.
하지만 정규 표현식에서 '*'는 0개 이상의 모든 문자를 의미하므로,
('*' == '*') 뿐만 아니라 ('A' '*')도 TRUE로 판단됩니다. (A 는 모든 문자에 포함되므로 TRUE)

정규 표현식에 사용되는 메타 문자(Meta Character)설명

메타문자 의   미 예   시 설   명
^ 행의 시작 $ grep '^linux' linux로 시작하는 행
$ 행의 끝 $ grep 'linux$' linux로 끝나는 행
\< 단어의 시작 $ grep '\<linux' linux로 시작하는 단어를 포함하는 행
\> 단어의 끝 $ grep 'linux\>' linux로 끝나는 단어를 포함하는 행
. 임의의 모든 문자 종류 하나 $ grep 'l...x' l과 x사이에 세글자만 있을 수 있음
? 문자가 한개가 있거나 없거나 $ grep 'lin?x' ?에 문자하나가 들어가는 것을 검색
* 문자가 여러개 들어가거나 없거나 $ grep 'linux*'
$ grep 'lin*'
$ grep 'l*x'
$ grep '*linux'
linux를 모두 검색
(여러 파일의 이름을 표현할 때 사용하고, 단독으로 * 사용하면 모든 파일을 나타냄)
| or 기호 $ grep 'ab|cd|ef' ab나 cd나 ef 셋 중 하나라도 들어있으면 검색
\(\) 특정 기호 or 메타 문자를 무시
(문자 그 자체를 나타냄)
$ grep 'lin\.\x' .문자를 대응하는 것이 아니라 lin.x라는 문자를 검색
[] []는 안에 내용을 넣어 그 문자들 중 한문자를 의미 $ grep 'linux[123]' linux1, linux2, linux3을 검색
[0-9], [a-z] 숫자나 알파벳은 범위로 설정 가능 $ grep 'linux[0-9]' linux1부터 linux9까지 검색
[^] []안에 있는 ^는 부정을 의미
안에 있는 문자를 제외한다는 뜻
$ grep 'linux[^1-3]' linux1 부터 linux3까지를 제외한 문자 검색
\<\> \<는 단어의 시작\>는 단어의 끝(위에 있는 지시자 합친것) $ grep '\<linux\>'
linux로 시작하는 단어, linux로 끝나는 단어 검색

예를 들어 alinux2와 같이 중간에 linux가 있는 것은 안됨
a\{n\} 문자 a를 n번 반복 $ grep 'a\{2\}' a 문자가 2번 연속 반복되는 것을 검색
a\{n,\} 문자 a를 적어도 n번 이상 반복 (콤마가 있음) $ grep 'a\{2,\}' a 문자가 최소한 2번 이상 반복되는 것을 검색
a\{m,n\} 문자 a를 m번 이상 n번 이하로 반복 (반복 범위 지정) $ grep 'a\{2,4\}' a 문자가 2번 이상 4번 이하로 반복되는 부분
\(..\) 다음 사용을 위해 태그를 붙이는 역할
최대 9개까지 사용가능
$ grep \(linux\)A\1B linuxA에 \1이 태그되어linuxAlinuxB로 대응

2. grep 확장 브래킷 사용

위의 정규표현식과 더불어 확장 브래킷 [ ] 을 사용하는 방법이 있다.
grep에서 제공하는 상수로써 이용이 가능하다.

1
$ grep "[브래킷]" 파일명 # 대괄호 [] 를 두번 쓰게된다.
cs
브래킷 의미
[:alnum:] A-Z, a-z, 0-9 알파벳 문자와 숫자로 이루어진 문자열
[:alpha:] A-Z, a-z 알파벳 문자
[:blank:] \x09 스페이스와 탭
[:cntrl:] 컨트롤 제어 문자
[:digit:] 0-9 숫자
[:graph:] !-~ 공백이 아닌 문자(스페이스, 제어 문자들을 제외한 문자)
[:lower:] a-z 소문자
[:print:] graph와 유사하지만 스페이스 문자를 포함
[:punct:] !-/:-@[-'{-~ 문장 부호 문자
[:space:] \t\v\f 모든 공백 문자(newline 줄바꿈, 스페이스, 탭)
[:upper:] A-Z 대문자
[:xdigit:] 16진수에서 사용할 수 있는 숫자

3. grep 옵션

grep을 사용하는데 여러 옵션을 붙일 수 있다.
옵션을 정리해보면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ 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        : 파일 당 패턴이 일치하는 라인의 갯수 출력.
cs

4. grep 예제

- 문자열 검색

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ grep "STR" FILE1.txt        # FILE.txt에서 "STR" 문자열 검색.
$ grep "STR" *                # 현재 디렉토리 모든 파일에서 "STR" 문자열 검색.
$ grep "STR" *.ext            # ext 확장자를 가진 파일에서 "STR" 문자열 검색.
 
대소문자 구분하지 않고 문자열 검색 (-i)
$ grep -"STR" FILE.txt        # FILE.txt 파일에서 대소문자 구분없이(STR, str) 문자열 검색.
 
매칭되는 PATTERN이 없는 라인 선택 (-v)
$ grep -"STR" FILE.txt        # FILE.txt 파일에서 "STR"이 포함되지 않은 라인 표시.
 
단어 단위로 문자열 검색 (-w)
$ grep -"STRING" FILE.txt     # FILE.txt 파일에서 "STRING"이라는 문자열(단어 단위) 검색.
 
검색된 문자열이 포함된 라인 번호 출력 (-n).
$ grep -"STR" FILE.txt        # > "STR"이 포함된 라인 번호 출력.
 
하위 디렉토리를 포함한 모든 파일에서 문자열 검색 (-r)
$ grep -"STR" *
cs

- 검색 조정

1
2
3
4
5
6
검색 결과 갯수 제한 (-m)
grep -100 "STR" FILE.txt    # FILE.txt 파일에서 문자열 "STR"이 포함된 결과를 100개까지만 표시.
 
검색 결과 앞에 파일 이름 표시 (-H)
$ grep -"STR" *             # "STR"이 포함된 파일 이름 표시.
$ grep -Hn "STR" *            # "STR"이 포함된 파일 이름과 라인 번호 표시.
cs

- 정규식 패턴 사용

1
2
3
4
5
6
7
8
9
10
$ grep "the.*step" *        # "the"로 시작하여 "step"으로 끝나는 패턴 검색.
$ grep "A.*Z" *             #"A"로 시작하여 "Z"로 끝나는 패턴 검색.
$ grep "step[0-9]" *        # "step0""step1", ..., "step9" 패턴을 검색.
$ grep "[0-9]" *            # "[0-9]" 문자열 검색.
$ grep "\*" FILE.txt        # FILE.txt 파일에서 * 문자 검색.
$ grep "\." FILE.txt        # FILE.txt 파일에서 . 문자 검색.
$ grep "^C" FILE.txt        # FILE.txt 에서 C로 시작하는 라인 검색.
$ grep "^1" FILE.txt        # FILE.txt 에서 "1"으로 시작하는 라인 검색.
$ grep "\.$" FILE.txt       # FILE.txt "." 으로 끝나는 라인 검색.
$ grep -"\.$" FILE.txt    # FILE.txt "." 으로 끝나지 않는 라인 검색.
cs

- Pipe 명령어와 조합 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Pipe 명령어와 조합하여 사용 예제
 
find . -name "찾고 싶은 파일이름" | xargs grep -"찾고 싶은 글자"
 
# 날짜 기준이 생성일이라고  할 때, 첫 날짜는 검색하고자 하는 날짜, 두번째는 검색하고자 하는 다음날 날짜
$ find . -name *.log -newerct yyyy-MM-dd ! -newerct yyyy-MM-dd -exec grep -Hni '검색어' {} \;
 
# rnn.txt 라는 파일들을 find하여 출력한 결과를 grep의 매개변수 xarg로서 실행
# grep -"ip" rnn.txt > rnn 파일 속에 ip 라는 글자가 포함된 것을 찾고 싶을 때
$ find . -name "rnn.txt" | xargs grep -"ip" 
 
# 특정 파일이나 폴더를 검사해 특정 검색어가 있는 부분을 출력
$ find . -name '*.htm' | xargs grep -'hello'
 
# mylog파일을 실시간으로 액세스하고 IP주소가 192.168.49.16인 행만 추출
$ tail -f mylog.log | grep 192.168.15.86
 
# 현재 프로세스를 출력에서 "java"라는 문자열을 포함하는 라인만 표시 
$ ps -ef | grep "java"
 
# netstat명령어로 네트워크 상태를 모니터링하는데 그중 tcp만 확인
$ netstat | grep "tcp"
 
# 어플리케이션 로그중 "error" 문자열을 포함하는 라인을 한 화면씩 표시
$ grep "error" application.log | more
 
# mylog.txt 파일에서 Apple과 Banana이 있는 문자열들을 탐색
$ cat mylog.txt | grep 'Apple' | grep 'Banana'
cs

문서를 작성하면서 grep의 사용 용도가 다양하며, 자주 사용되다보니 상당히 길어졌습니다.
모든 기능을 다 외워두고 사용하는건 어려울거라 생각합니다만, 필요할 때 참고 가능한 포스팅이 된다면 좋겠습니다.