grep은 linux 커맨드 중 가장 많이 쓰이는 커맨드 중 하나이다.
서버 개발자 기준으로 로그나 데이터를 조회하고 분석할 때 grep은 필수이다.

grep options

grep을 그냥 써도 좋지만 사용하면 유용한 옵션들이 있다.
grep을 아는 것과 grep을 효율적으로 쓸 수 있는 것은 다른 것이다.

grep option 테스트에 활용할 file 만들기

if __name__ == "__main__":
with open("numbers.txt", 'w') as fw:
 for i in range(10000):
   fw.write("numbers: " + str(i) + " ...\n")

grep의 옵션을 확인하기 앞서 grep을 테스트할 문서를 만들어본다.
0부터 9999까지 갖는 file을 만들어 grep을 테스트한다.
이해가지 않는 부분이 있다면 테스트 file을 활용하면 더 이해하기 쉽다.

대소문자 무시하기

grep Num numbers.txt
grep -i Num numbers.txt

grep -i 검색하는 문자에서 대소문자를 무시(ignore)한다.

개수 지정하기

grep -m 5 1234 numbers.txt

grep -m 1 처음 매칭되는 1개의 라인(max count)만 출력한다.

line number 출력하기

grep -n 1234 numbers.txt

grep -n file의 몇 번째 라인(number)에 있는지도 함께 출력한다.

매칭되지 않는 것 확인하기

grep -v 1 numbers.txt

grep -v 매칭되지 않는(invert match) 라인만 출력한다.

필요한 범위까지만 확인하기

grep -o 1234 numbers.txt
grep -o ".\{0,3\}1234.\{0,3\}" numbers.txt

grep -o 매칭되는 결과만(only match) 출력한다.
-o 에서는 정규식을 활용하여 검색하고자 하는 문자의 앞 뒤만 출력하도록 할 수 있다.
-o를 사용하면 하나의 라인이 굉장히 긴 경우에서 필요한 범위의 값들만 grep 할 수 있어 용이하다.

OR 하기

grep -e 1234 -e 5678 numbers.txt

grep -e 정규식을 활용하여 검색할 수 있다.
-e는 여러 개의 정규식을 동시에 검색할 수 있어서 OR 조건처럼 사용할 수 있다.

앞 뒤의 라인까지 출력하기

grep -A 2 1234 numbers.txt
grep -B 2 1234 numbers.txt
grep -C 2 1234 numbers.txt

grep -A 2 찾은 line에서 뒤의(After) 2라인 표시
grep -B 2 찾은 line에서 앞의(Before) 2라인 표시
grep -C 2 찾은 line에서 앞뒤로 2라인까지 표시

file name 출력 하기 / 안하기

grep -H 1234 numbers.txt
grep -h 1234 numbers*

grep -H fileName을 같이 출력한다.
grep -h fileName을 출력하지 않는다.

default 값은 여러 file을 검색할 때는 fileName이 출력된다.
단일 file을 검색할 때는 fileName이 출력되지 않는다.

recursive 검색하기

grep -r 1234 .

grep -r 1234 . 현재 directory recursive 하게 grep한다.

매칭되는 count 보기

grep -c 1234 numbers.txt

grep -c 검색어 결과의 count를 출력한다.

grep 응용법

grep만 쓴다면 command 활용에 있어서는 주니어에 가깝다.
grep을 다른 명령어들과 함께 얼마나 효율적으로 사용하느냐가 퍼포먼스를 좌우한다.

기본 사용법

grep 1234 numbers.txt
grep 1234 numbers.txt*

가장 간단한 grep의 사용법으로 간단하지만 가장 많이 쓰인다.

pipeline과 사용하기

cat numbers.txt|grep 1234
cat numbers.txt|grep 1234|cut -d ':' -f 2

커맨드 pipeline을 조합해 더 효율적으로 grep을 사용할 수 있다.

tail과 사용하기

tail -f numbers.txt|grep 1234
tail -F numbers.txt|grep 1234

tail -f, tail -F 는 file에 추가되는 line을 follow 할 때 사용한다.
나는 주로 실시간으로 작성되는 서버 로그를 분석할 때 많이 사용한다.
그렇지만 1초에 수 천 라인의 로그가 찍히는 서버를 이렇게 보기란 불가능에 가깝다.
실시간으로 서버 로그를 분석할 때 tail과 함께 grep으로 원하는 로그를 실시간으로 분석할 수 있다.

tail -f 현재 file name과 일치하는 file을 follow 한다.
tail -F file이 변경되더라도 file의 name을 기준으로 follow 한다.

일반적으로 로그 file은 시간에 따라 rolling 되면서 file name이 바뀌고, 새로운 file이 생긴다.
-f는 현재 file을 follow 하면서 rolling으로 인해 file name이 바뀌는 경우 로그가 더 출력되지 않는다.
-F는 file name을 기준으로 file이 변경되면 다시 follow를 하기 때문에 rolling이 되더라도 로그가 계속 출력된다.