Linux "grep" 문자열 검색 명령어

Develop/Linux 2020.12.11 댓글 PSJco
728x90
반응형

오늘은 Linux 시스템 사용에 엄청난 빈도로 사용하게 되는 grep 명령어 사용법을 정리해 본다. 

#1. grep 이란?

grep 은 global / regular expression / printprint에서 각각의 머릿글자를 따 온 것이며 이것은 ed 텍스트 편집기에서 쓰이는 연속적인 지시어이다. grep 명령어는 파일이나 표준 입력을 검색하여 주어진 정규 표현식과 맞는 줄을 찾아 프로그램의 표준 출력으로 출력한다. 

 

"주어진 파일/입력에서 패턴 검색해서 출력하는 명령어, 패턴 - 정규표현식, 일반 문자열 패턴."

#2. grep 명령어 옵션

사용법: grep [옵션]... 패턴 [파일]...
각 파일 또는 표준 입력에서 PATTERN을 검색합니다.
PATTERN은 기본적으로 기본 정규식 (BRE)입니다.
Example: grep -i 'hello world' menu.h main.c

정규식 선택 및 해석 :
  -E, --extended-regexp     PATTERN 을 확장정규식(ERE)으로 해석
  -F, --fixed-strings       PATTERN을 정규식(RegEx)이 아닌 일반 문자열로 해석
  -G, --basic-regexp        PATTERN을 기본 정규식(BRE)으로 해석
  -P, --perl-regexp         PATTERN을 Perl 정규식으로 해석
  -e, --regexp=PATTERN      매칭을 위한 PATTERN 사용
  -f, --file=FILE           파일에 있는 PATTERN 사용
  -i, --ignore-case         대/소문자 구분 안함
  -w, --word-regexp         PATTERN 이 단어 단위로 매칭
  -x, --line-regexp         PATTERN 이 라인 단위로 매칭
  -z, --null-data           라인의 끝을 newline(\n) 이 아닌 0 byte(null)로 구분
추가 옵션 :
  -s, --no-messages         메시지 표시 제한
  -v, --invert-match        일치하지 않는 라인 선택
  -V, --version             버전 정보를 표시하고 종료
      --help                도움말 텍스트를 표시하고 종료

출력 제어 :
  -m, --max-count=NUM       최대 매칭 결과 갯수 제한
  -b, --byte-offset         출력 행과 함께 행의 byte offset 표시
  -n, --line-number         출력 행과 함께 행번호 표시
      --line-buffered       모든 라인에서 출력을 플러시
  -H, --with-filename       출력 행과 함께 파일이름 출력
  -h, --no-filename         출력 행의 파일이름 접두사 제한
      --label=LABEL         LABEL을 표준 입력 파일 이름 접두사로 사용
  -o, --only-matching       매칭된 문자열만 표시
  -q, --quiet, --silent     검색결과 출력하지 않음
      --binary-files=TYPE   파일의 타입을 지정 TYPE : 'binary', 'text', or 'without-match'
  -a, --text                바이너리 파일을 텍스트 파일처럼 처리, --binary-files=text 와 동일
  -I                        바이너리 파일은 검사하지 않음, --binary-files=without-match 와 동일
  -d, --directories=ACTION  디렉토리 처리 방식 지정 ACTION : 'read', 'recurse', or 'skip'
  -D, --devices=ACTION      장치 파일 처리 방식 지정 ACTION : 'read' or 'skip'
  -r, --recursive           하위 디렉토리 탐색 --directories=recurse 와 동일
  -R, --dereference-recursive 
                            심볼릭 링크를 따라가며 모든 하위디렉토리를 탐색
      --include=FILE_PATTERN
                            FILE_PATTERN과 일치하는 파일 만 검색
      --exclude=FILE_PATTERN
                            FILE_PATTERN과 일치하는 파일 및 디렉토리 건너 뛰기
      --exclude-from=FILE   FILE의 파일 패턴과 일치하는 파일 건너 뛰기
      --exclude-dir=PATTERN PATTERN 과 일치하는 디렉토리는 건너 뛰기
  -L, --files-without-match 일치하지 않는 파일 이름만 표시
  -l, --files-with-matches  일치하는 파일 이름만 표시
  -c, --count               파일 당 일치하는 라인의 갯수 출력
  -T, --initial-tab         탭 정렬 (필요한 경우)
  -Z, --null                파일 이름 뒤에 0 byte 출력

컨텍스트 제어:
  -B, --before-context=NUM  선행 컨텍스트의 NUM 줄 출력
  -A, --after-context=NUM   후행 컨텍스트의 NUM 줄 출력
  -C, --context=NUM         출력 컨텍스트의 NUM 줄 출력
  -NUM                      --context=NUM 과 동일
      --group-separator=SEP SEP를 그룹 구분자로 사용
      --no-group-separator  그룹 구분자로 빈 문자열 사용
      --color[=WHEN],
      --colour[=WHEN]       마커를 사용하여 일치하는 문자열을 강조 표시 WHEN : 'always', 'never', or 'auto'
  -U, --binary              EOL에서 CR 문자를 제거하지 않음 (MSDOS / Windows)
  -u, --unix-byte-offsets   마치 CR이없는 것처럼 오프셋을 보고(MSDOS/Windows)

'egrep'는 'grep -E'를 의미함.  'fgrep'는 'grep -F'를 의미함.
'egrep','fgrep' 직접 호출하는 것은 더이상 사용되지 않습니다.
 FILE이-이면 표준 입력을 읽습니다. FILE없이. 명령 줄인 경우
-r이 주어지고,-그렇지 않으면. 두 개 미만의 FILE이 제공된 경우 -h로 가정하십시오.
행이 선택되면 종료 상태는 0이고 그렇지 않으면 1입니다. 
오류가 발생하고 -q가 제공되지 않으면 종료 상태는 2입니다.

#3. 명령어 사용 예제 

기본적인 사용 방법은 다음과 같다. 

$ grep [옵션]... [패턴] [파일]...

다음 예는 "FILE.txt"의 내용에서 "FireEye"라는 문자열을 검색하고, 존재하는 라인을 출력하는 예이다. "-i" 옵션을 주지 않으면 기본적으로는 대/소문자를 구분한다.

$ cat FILE.txt 
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker. 
Hackers targeted and accessed the firm’s so-called Red Team tools, which it uses to test customer security and find vulnerabilities. 
Now there’s concern that the hackers could release these tools publicly or use them to attack others, though there is no evidence that this has happened yet. 
FireEye says that it does not believe any customer information was taken.
$ grep "FireEye" FILE.txt 
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker. 
FireEye says that it does not believe any customer information was taken.

 

자주 사용되는 grep 명령어는 다음과 같다. 

명령어 설명
grep "aaa" [파일명] 파일에서 문자열 검색 (대/소문자 구분)
grep "aaa" * 현재 경로에 모든 파일에서 문자열 검색
grep "aaa" *.txt 현재 경로에 특정 확장자를 가진 모든 파일에서 문자열 검색
grep -i "aaa" [파일명] 파일에서 대/소문자를 구분하지 않고 문자열 검색
grep -ai "aaa" [파일명] 파일을 텍스트 형식으로 대/소문자를 구분하지 않고 문자열 검색
grep -v "aaa" [파일명] 파일에서 문자열이 검색되지 않는 라인 표시
grep -w "aaa" [파일명] 파일에서 문자열을 단어 단위로 검색
grep -n "aaa" [파일명] 파일에서 문자열이 포함된 라인번호를 함께 표시
grep -H "aaa" [파일명] 파일에서 문자열이 포함된 파일명을 함께 표시
grep -r "aaa" * 현재 경로에 하위 경로를 포함한 모든 파일에서 문자열 검색
grep -m 10 "aaa" [파일명] 파일에서 문자열을 검색해서 10라인 만 표시 (검색 결과수 제한)
grep "A.*B" [파일명] 파일에서 문자열 A로 시작하여 문자열 B로 끝나는 패턴 찾기(정규식사용)
grep "aaa[a-z]" [파일명] 파일에서 변경되는 패턴 찾기 (정규식사용)
grep -F "*[].^-()$.." [파일명] 문자열 전체를 정규식 메타문자가 아닌 일반 문자로 검색 (정규식 메타문자 무시)
grep "\*" [파일명] 문자를 정규식 메타문자가 아닌 일반 문자로 검색("\" Escape 문자 사용)
grep "^aaa" [파일명] 파일에서 문자열로 시작하는 라인 검색
grep "aaa$" [파일명] 파일에서 문자열로 끝나는 라인 검색

자, 이제부터 하나씩 간단한 예제와 함께 보충설명 들어간다. 

 

#3-1. 파일에서 문자열 검색 (대/소문자 구분)

grep 명령에 문자열과 파일 이름을 지정하여, 파일에서 문자열을 검색할 수 있다. 문자열 검색 결과는 문자열을 포함한 라인 단위로 출력된다. 

grep "aaa" [파일명] : 파일에서 "aaa" 문자열 검색

$ grep "FireEye" FILE.txt
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
FireEye says that it does not believe any customer information was taken.

#3-2. 현재 경로에 모든 파일에서 문자열 검색

grep 명령에 문자열과 '*' 입력을 통해, 현재 경로에 있는 모든 파일에서 문자열을 검색할 수 있다.


grep "aaa" * : 현재 경로에서 "aaa" 문자열 검색

$ grep "FireEye" *
FILE.txt:One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
FILE.txt:FireEye says that it does not believe any customer information was taken.

#3-3. 현재 경로에 특정 확장자를 가진 모든 파일에서 문자열 검색

grep 명령에 문자열과 '*.ext' 확장자 입력을 통해, 현재 경로에 있는 특정 확장자를 가진 모든 파일에서 문자열을 검색할 수 있다.


grep "aaa" *.txt : 현재 경로에서 txt 확장자를 가진 모든 파일에서 "aaa" 문자열 검색

$ grep "FireEye" *.txt
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
FireEye says that it does not believe any customer information was taken.

#3-4. 파일에서 대/소문자를 구분하지 않고 문자열 검색

grep 명령에 문자열 검색 시 대/소문자를 무시하고 검색하는 옵션을 통해 대/소문자 구분 없이 문자열을 검색할 수 있다.

 

grep -i "aaa" [파일명]  : 파일에서 대/소문자를 구분하지 않고 "aaa" 문자열 검색

$ grep -i "fireeye" FILE.txt
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
FireEye says that it does not believe any customer information was taken.

#3-5. 파일을 텍스트 형식으로 대/소문자를 구분하지 않고 문자열 검색

grep 명령을 통해 바이너리 형태의 파일을 검색시 원하는 검색 결과가 나오지 않는 경우가 있다. 이럴 경우 텍스트 형식으로 변환하여 검색이 가능하다. (예제는 대/소문자 무시 옵션과 혼용)

 

grep -ai "aaa" [파일명]  : 파일에서 대/소문자를 구분하지 않고 텍스트 형식으로 "aaa" 문자열 검색

$ grep -ai "fireeye" FILE.txt
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
FireEye says that it does not believe any customer information was taken.

#3-6. 파일에서 문자열이 검색되지 않는 라인 표시

grep 명령을 통해 특정 문자열/패턴이 존재하지 않는 라인을 검색할 수 있다.

 

grep -v "aaa" [파일명]  : 파일에서 "aaa" 문자열이 검색되지 않은 라인을 표시

$ grep -v "FireEye" FILE.txt
Hackers targeted and accessed the firm’s so-called Red Team tools, which it uses to test customer security and find vulnerabilities.
Now there’s concern that the hackers could release these tools publicly or use them to attack others, though there is no evidence that this has happened yet.

#3-7. 파일에서 문자열을 단어 단위로 검색

-w 옵션을 통해 문자열을 단어 단위로 검색 할 수 있다.

 

grep -w "aaa" [파일명]  : 파일에서 "aaa" 문자열을 단어 단위로 검색한다

$ grep -w "information" FILE.txt
FireEye says that it does not believe any customer information was taken.

#3-8. 파일에서 문자열이 포함된 라인 번호를 함께 표시

-n 옵션을 사용하면 파일에서 문자열이 검색된 라인번호를 포함하여 표시할 수 있다.

 

grep -n "aaa" [파일명]  : 파일에서 "aaa" 문자열을 검색하여 라인 번호와 함께 표시한다

$ grep -n "FireEye" FILE.txt
1:One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
4:FireEye says that it does not believe any customer information was taken.

#3-9. 파일에서 문자열이 포함된 파일명을 함께 표시

-H 옵션을 사용하면 파일에서 문자열이 검색된 파일명을 함께 표시할 수 있다. "*"를 통한 여러 파일을 대상으로 검색할 경우 유용하다. (다중 파일 검색 시 따로 명시하지 않아도 기본 적용) 

 

grep -H "aaa" [파일명]  : 파일에서 "aaa" 문자열을 검색하여 라인 번호와 함께 표시한다

$ grep -H "information" *
FILE.txt:FireEye says that it does not believe any customer information was taken.
anaconda-ks.cfg:# System authorization information
anaconda-ks.cfg:# Network information
anaconda-ks.cfg:# Partition clearing information
anaconda-ks.cfg:# Disk partitioning information

#3-10. 현재 경로에 하위 경로를 포함한 모든 파일에서 문자열 검색

-r 옵션을 이용하면 현재 경로 하위에 모든 파일에서 문자열을 검색할 수 있다.

 

grep -r "aaa" *  : 현재 경로 하위 모든 파일에서 "aaa" 문자열을 검색하여 표시한다

$ grep -r "Fire" *
FILE.txt:One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
FILE.txt:FireEye says that it does not believe any customer information was taken.

#3-11. 파일에서 문자열을 검색해서 10라인 만 표시 (검색 결과수 제한)

-m 옵션을 사용해서 검색 결과 개수를 제한할 수 있다. (여러 파일을 대상으로 검색할 경우 한 파일당 개수 제한이 적용된다) 

 

grep -m 10 "aaa" [파일명]  : 파일에서 "aaa" 문자열을 검색하여 10개만 표시한다

$ grep -m 1 "information" *
FILE.txt:FireEye says that it does not believe any customer information was taken.
anaconda-ks.cfg:# System authorization information

#3-12. 파일에서 문자열 A로 시작하여 문자열 B로 끝나는 패턴 찾기 (정규식 사용)

정규식을 사용해서 "." "*" 이용하여 특정 문자로 시작하고 끝나는 패턴을 검색할 수 있다.

 

grep "A.*B" [파일명]  : 파일에서 A로 시작하고 B로 끝나는 패턴을 검색해 표시한다

$ grep "F.*e" FILE.txt
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
FireEye says that it does not believe any customer information was taken.

#3-13. 파일에서 변경되는 패턴 찾기 (정규식 사용)

정규식 "[]"를 사용해서 변화되는 패턴의 검색도 가능하다.

 

grep "aaa[a-z]" [파일명]  : 파일에서 aaaa~aaaz까지의 변화되는 문자열 패턴을 검색한다

$ grep "FireEy[a-z]" FILE.txt
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
FireEye says that it does not believe any customer information was taken.

#3-14. 문자열 전체를 정규식 메타 문자가 아닌 일반 문자로 검색 (정규식 메타문자 무시)

-F 옵션을 사용해 정규식 메타 문자를 일반 문자로 취급하여 검색할 수 있다. (입력된 문자를 모두 일반 문자로 취급하여 검색)

 

grep -F "." [파일명]  : 파일에서 메타문자 "."가 아닌, 일반 문자 "."를 검색한다

$ grep -F "." FILE.txt 
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
Hackers targeted and accessed the firm’s so-called Red Team tools, which it uses to test customer security and find vulnerabilities.
Now there’s concern that the hackers could release these tools publicly or use them to attack others, though there is no evidence that this has happened yet.
FireEye says that it does not believe any customer information was taken.

#3-15. 문자를 정규식 메타문자가 아닌 일반 문자로 검색 ("\" Escape 문자 사용)

-F  옵션 외에도 문자열 중 메타 문자가 포함될 경우, "\" 문자를 통해 일반 문자로 취급하여 검색 할 수 있다.

 

grep "\." [파일명] : 파일에서 메타문자 "."가 아닌, 일반 문자 "."를 검색한다 ("\" Escape 문자 사용)

$ grep "\." FILE.txt 
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.
Hackers targeted and accessed the firm’s so-called Red Team tools, which it uses to test customer security and find vulnerabilities.
Now there’s concern that the hackers could release these tools publicly or use them to attack others, though there is no evidence that this has happened yet.
FireEye says that it does not believe any customer information was taken.

#3-16. 파일에서 문자열로 시작하는 라인 검색

정규식 메타문자 "^"를 사용하여 특정 문자로 시작되는 패턴을 검색한다. 

 

grep "^aaa" [파일명] : 파일에서 "aaa"로 시작하는 라인을 검색한다

$ grep "^One" FILE.txt 
One of the US’s leading cybersecurity firms, FireEye, says it’s been hacked by a state-sponsored attacker.

#3-17. 파일에서 문자열로 끝나는 라인 검색

정규식 메타문자 "$"를 사용하여 특정 문자로 시작되는 패턴을 검색한다. 

 

grep "aaa$" [파일명] : 파일에서 "aaa"로 끝나는 라인을 검색한다

$ grep "yet.$" FILE.txt 
Now there’s concern that the hackers could release these tools publicly or use them to attack others, though there is no evidence that this has happened yet.

 

#4. Pipe 명령어와 콜라보

grep 명령어는 단독으로도 많이 사용되지만, 나의 경우는 다른 명령어와 Pipe 명령어 "|"로 연결하여 자주 사용한다. 매우 유용하며 활용도가 높다.

파이프 "|" 명령어는 왼쪽 명령어의 출력을 -> 오른쪽 명령어의 입력으로 전달하는 명령어다.

# 현재 프로세스를 출력에서 "java"라는 문자열을 포함하는 라인만 표시 
$ ps -ef | grep "java"

# 어플리케이션의 로그를 tail 하면서 "error" 문자열을 포함하는 라인 표시
$ tail -f application.log | grep -i "error"

$ netstat | grep "tcp"

# 어플리케이션 로그중 "error" 문자열을 포함하는 라인을 한 화면씩 표시
$ grep "error" application.log | more

이 외에도 아주 다양하게 다른 명령어(find, awk..)와 조합하여 응용할 수 있다.

 

이상 여기까지 리눅스 명령어 grep에 대해 정리해 봤다. 

728x90
반응형

댓글