## 개요
단순하면서도 강력한 도구는 무엇이 있을까? 라고 질문했을 때 가장 먼저 생각할 수 있는 도구는 바로 `grep`일 것이다. 대부분의 리눅스 유저들은 이 명령어에 익숙할 것인데, 가볍고 강력한 친구이다. 오늘은 이 작은 거인에 대한 짧은 리뷰를 해볼 예정이다.
## Explanation
`grep`은 리눅스 쉘에서 지원하는 기능이며, 윈도우에서는 지원하지 않는다.
윈도우에서는 `find` , `findstr`같은 유사 기능이 존재하니, 이는 다음에 따로 다뤄보도록 하자.
너무 뻔한 이야기는 생략한다. `grep`은 기본적으로 어떤 출력문에 대해 특정 문자열을 찾아주는 기능이다.
이때 정규 표현식을 사용할 수도 있고, 다양한 종류의 입력을 통해 빠른 찾기를 지원하기에 많이 사용하는 도구이다.
## Usage
기본적인 사용법을 알아보자.
```
grep [-E|-F] [-c|-l|-q] [ -R [-H | -L | -P] ] [-ihnsvwxy] [-e _pattern_list_] [-f _pattern_file_] [_pattern_] [_file ..._]
```
## Options
### -E
확장 정규식(ERE)을 사용합니다.
### -F
정규식을 인식하지 않습니다.
### -H
-R 옵션이 지정된 경우, 명령행의 기호 링크를 따릅니다. 트리 조회에서 발견된 기호 링크는 따르지 않습니다.
### -L
-R 옵션이 지정된 경우, 명령행의 기호 링크와 트리 조회에서 발견된 기호 링크를 모두 따릅니다.
### -P
-R 옵션이 지정된 경우, 기호 링크를 따르지 않습니다.
### -R
_파일_이 디렉토리를 지정하는 경우, grep는 해당 위치에 연결된 전체 서브트리에서 각 파일을 탐색합니다.
### -c
선택된 행의 계수만 표준 출력에 기록됩니다.
### -e
_pattern_list_은 하나 이상의 탐색 패턴을 지정합니다. 각 패턴은 개행 문자로 분리되어야 합니다.
### -f
_pattern_file_은 탐색 패턴이 들어 있는 파일을 지정합니다. 각 패턴은 개행 문자로 분리해야 합니다.
### -h
파일명 헤더를 인쇄하지 않습니다.
### -i
비교할 때는 문자의 케이스가 무시됩니다. 즉, 대문자와 소문자가 동일한 것으로 간주됩니다.
### -l
선택된 행이 들어 있는 파일의 이름만 표준 출력에 기록됩니다. 경로명은 탐색된 파일당 한 번 나열됩니다. 표준 입력을 탐색하면 경로명 "-"가 기록됩니다.
### -n
각 출력 행 앞에 파일의 상대 행 번호가 있고, 각 파일이 행 1에서 시작됩니다. 처리되는 각 파일에 대해 행 번호 카운터가 재설정됩니다. -c, -l 또는 -s옵션이 지정된 경우 이 옵션이 무시됩니다.
### -q
메세지가 인쇄되지 않는 정숙 모드입니다. 종료 상태만 리턴됩니다.
### -s
존재하지 않거나 읽을 수 없는 파일에 대해 일반적으로 기록되는 오류 메세지를 억제합니다. 기타 메세지는 억제되지 않습니다.
### -v
선택된 행이 지정된 패턴과 일치하지 않는 행입니다.
### -w
표현식을 단어 단위로("[[:<:]]" 및 "[[:>:]]"로 둘러싸인 것처럼) 탐색합니다.
### -x
패턴이 행의 유일한 항목이면 행과 일치합니다. 이 옵션은 -w 옵션에 우선합니다. 둘 다 지정된 경우, -w 옵션은 무시됩니다.
### -y
대소문자를 구분하지 않습니다(-i와 동일).
## 결론
사실 grep 자체는 엄청나게 대단한 도구는 아니다.
디지털 포렌식을 수행하는 입장에서, 방대한 패킷이나 방화벽 로그 등 대용량 데이터를 처리할 때
“가볍고”, “빠르게” 처리할 수 있다는 점에서 유의미한 것이다.
비슷하게 [[SED]] 와 [[awk]] 도 사용법을 간단히 숙지한 다음, [[로그 포렌식]] 시나리오를 이해하는데 중점을 두도록 하자.