프로젝트를 분석하거나, 디버깅을 할 때 grep을 많이 이용하게 됩니다. 특정 키워드로 찾아 들어가면서 분석을 많이 하는 편인데요.

 

 예를 들자면, a라는 패턴을 찾기 위해서 프로젝트 전체를 재귀적으로 탐색한 다음에 해당 코드를 보는 편입니다. 그런데, 저는 해당 패턴이 걸리는 줄 주변의 이전 라인, 다음 라인도 같이 출력을 하고 싶었습니다. 그러면 1개의 줄만 볼 때 보다 맥락을 조금 더 잘 파악할 수 있었을 것이기 때문입니다. 이런 옵션이 없었을 리가 없었습니다. 저만 몰랐을 뿐. grep 명령어에는 이런 처리를 위해, 몇 가지 옵션이 있는데요. -A, -B, -C 옵션에 대해 알아보겠습니다.

 

 

 먼저 실험에 사용할 파일 1.txt에는 위와 같은 내용이 저장되어 있습니다. a부터 g까지 순서대로 적혀 있고, 그 다음 줄에 a부터 b까지 순서대로 적혀 있습니다. 다음에, a부터 z까지 순서대로 적혀있는, 총 35줄로 이루어진 파일입니다.

 


 먼저 A 옵션입니다. match가 되는 line 다음 몇 개의 줄을 같이 출력해 줍니다. 예를 들어 -A2는 매치되는 줄이 x번째 줄이라고 하면, x+1, x+2번째 줄도 같이 출력해 줍니다.

 

 grep -nA1 a는 뭘 의미할까요? 일단 패턴은 a입니다. a가 매치되는 줄들은 출력을 합니다. n은 라인을 출력합니다. A1은 매치되는 줄 다음의 1개 줄을 출력합니다. 이걸 종합해 보면, 1.txt에서 a와 매치되는 줄과, 매치되는 줄 다음 1줄을 출력한다는 의미에요. 매치되는 줄을 보면 1, 8, 10번째 줄인데요. 1, 8, 10번째 줄의 다음 줄은 2, 9, 11번째 줄입니다. 따라서, 1, 2, 8, 9, 10, 11번째 줄이 출력됩니다.

 

 

 반대로, -B 옵션을 주면, 매치되는 줄과 매치되는 줄 이전 몇 개의 줄을 출력하게 됩니다. 예를 들어 -B2는 매치되는 줄의 이전 2개의 줄을 같이 출력합니다. 예를 들어, x+2번째 줄이 매치되었다면, x번째 줄과 x+1번째 줄이 같이 출력됩니다.

 

 grep -nB1 a는 뭘 의미할까요? 일단 a가 매치되는 줄은 1, 8, 10번째 줄입니다. B1이므로 매치되는 줄 이전 줄까지 같이 출력합니다. 8번째 줄의 이전 줄은 7번째 줄이고, 10번째 줄의 이전 줄은 9번째 줄이니, 1, 7, 8, 9, 10번째 줄이 출력되게 됩니다. 

 

 

 그리고, -B2 옵션을 주면, 매치되는 줄로부터 위에 2개의 줄까지 같이 출력함을 볼 수 있습니다. 매치되는 줄 이전 2개의 줄과, 이후 1개의 줄을 출력하려면 어떻게 해야 할까요? A 옵션과 B 옵션을 같이 쓰면 됩니다. A1 B2 옵션을 주면, 제가 말한 요구 사항을 만족하게 됩니다.

 

 

 위 명령어는 패턴 h와 매치되는 줄 이전 2개의 줄과, 이후 1개의 줄을 매치되는 줄과 같이 출력하는 명령입니다. 그런데, 이전 2개의 줄과 이후 2개의 줄까지 같이 출력할 때 -A2 -B2 이렇게 옵션을 주기는 귀찮을 거 같습니다.

 


 이러한 귀찮음을 해결하기 위해 C 옵션이 있습니다.

 

 

 먼저, -nC2는 매치되는 줄과 이전 2개의 줄과 다음 2개의 줄을 출력합니다. f가 매치되는 줄은 6, 15번째 줄이였으니, 이 주변에 있는 4, 5, 7, 8, 13, 14, 16, 17번째 줄도 6, 15번째 줄과 같이 출력합니다.

 

 

 -nC3은 매치되는 줄과 이전 3개 줄, 다음 3개줄이 출력됩니다.