ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쉘 스크립트, grep 으로 찾은 문자열 전후의 행 출력하기
    Development 2020. 3. 23. 23:03

    종종 사용하지만 매일 사용하지 않는 명령이나 옵션들이 많습니다.

    금방 기억이 나면 좋으련만 나이가 들어가는지 매번 구글의 도움을 받게 되네요.

    겸사겸사 블로그에 기록해 두고 저와 비슷한 기억력 감퇴를 겪는 분들에게

    일말의 도움을 주고자 이렇게 시간을 할애해 봅니다. (훗)

     

     


    리눅스나 맥 환경에서 grep 은 정말 유용한 명령입니다.

    텍스트 파일에서 필요한 내용을 찾아내는데 도사이기 때문이죠.

    간단한 사용법은 cat 등으로 텍스트 파일을 읽고

    파이프로 grep 을 연결해서 필요한 필터 조건을 거는 방법입니다. 

     

    // "NoPD" 가 들어간 행을 찾습니다
    $ cat test.txt | grep NoPD

     

    만약 대량의 로그파일에서 필요한 내용을 찾으려면 어떻게 해야 할까요?

    단순한 웹 엑세스 로그라면 위와 같은 방법에 한번 더 파이프로 awk 를 연결하면 되겠습니다만 

    Java 의 trace 로그라던가 debug 성격의 로그라면 

    에러 문자열 앞뒤에 있는 여러 행을 또 찾아야 합니다.

     

    이럴때 써먹을 수 있는 grep 의 좋은 옵션이 있었으니

    After 를 상징하는 -A 와 Before 를 나타내는 -B 옵션이 우리의 구세주입니다. 

    아래와 같은 파일이 있다고 해보겠습니다. 

     

    $ cat test.txt
    03/23	1
    03/23	2
    03/23	3
    03/23	4
    03/23	separator
    03/23	5
    03/23	6
    03/23	7
    03/23	8

     

    우리는 separator 라는 문자를 찾도록 grep 을 이용할 겁니다.

    그리고 여기에 -A 와 -B 옵션을 이용해서

    separator 문자열 앞 뒤의 행들을 같이 결과로 출력해 보겠습니다. 

     

    // separator 문자열이 포함된 행 바로 뒤(After)의 4개 행을 출력합니다. 
    $ cat test.txt | grep -A 4 separator
    03/23	separator
    03/23	5
    03/23	6
    03/23	7
    03/23	8
    
    // separator 문자열이 포함된 행 바로 직전(Before)의 4개 행을 출력합니다.
    $ cat test.txt | grep -B 4 separator
    03/23	1
    03/23	2
    03/23	3
    03/23	4
    03/23	separator

     

    네, 참 쉽고 편리합니다.

    만약 separator 가 여러개 있다면 어떻게 될까요?

     

    // separator 가 여러 행에 존재하는 파일
    $ cat test.txt
    03/23	1
    03/23	2
    03/23	3
    03/23	4
    03/23	separator
    03/23	5
    03/23	6
    03/23	7
    03/23	8
    03/24	separator
    03/24	9
    03/24	10
    03/24	11
    03/24	12
    
    // 모든 separator 를 찾아 이후(After) 4개의 행을 출력합니다. 친절하게 -- 로 행 나눔까지...
    $ cat test.txt | grep -A 4 separator
    03/23	separator
    03/23	5
    03/23	6
    03/23	7
    03/23	8
    --
    03/24	separator
    03/24	9
    03/24	10
    03/24	11
    03/24	12
    
    // 모든 separator 를 찾아 이전(Before) 4개의 행을 출력합니다. 역시... 친절합니다. 
    $ cat test.txt | grep -B 4 separator
    03/23	1
    03/23	2
    03/23	3
    03/23	4
    03/23	separator
    --
    03/23	5
    03/23	6
    03/23	7
    03/23	8
    03/24	separator


    알아서 척척척 일을 잘 해줍니다.

    before, after... 로 grep 의 -B, -A 옵션을 기억합시다!!

    댓글 0

NoPD