프로젝트에서 키워드를 검색해서 빠르게 분석하는 경우가 꽤 있었습니다. 그런데, 간혹 가다가 1줄에 굉장히 많은 문자들이 있는 결과까지 나와서 당황했던 경험이 있었습니다. 이런 결과들을 제외하려면 어떻게 해야 할까요? 결과가 매치되는 문자열 중에 특정 길이가 넘어가는 친구들을 제외해 봅시다.

 


 먼저, 위 명령어는 파일 test.log 내에서 tomcat이라는 것이 매치되는 줄들을 모두 출력합니다. 그런데, 중간에 매우 긴 문자열이 하나 있는데요. 이 문자열의 길이가 얼마나 긴지 보겠습니다.

 

 2075나 되네요. 이런 결과들을 제하려면 어떻게 해야 할까요?

 

 

 먼저 .는 any character를 나타냅니다. 그래서, cat test.log | grep .는 어떤 문자가 있는 line을 출력합니다. 여기까지 보면, 어? 한글과 히라가나, 한자 같은 것도 모두 포함이겠네? 라고 생각하실 수 있지만, 함정은 아래에서 후술하겠습니다.

 

 

 그러면 ^.는 무엇을 의미할까요? 어떠한 문자로 시작한다는 것을 의미합니다. 그래서, cat test.log | grep ^.은, test.log에 있는 라인 중에서,  어떠한 문자로 시작하는 패턴을 가지는 라인을 출력한다는 의미입니다. 네. 당연히 설정된 로케일은 고려하셔야 겠지만, 쉽게 말하면 그러합니다. 이제, tomcat이라는 문자열을 포함하면서, 길이가 1이상 10이하인 문자열을 출력하려면 어떻게 하면 될까요?

 

 

 grep을 2번 쓰면 됩니다. 먼저 tomcat이 있는 문자열들을 찾습니다. 그 다음에, 그 문자열들 중에, 어떠한 문자가 1번 이상 10번 미만 반복되는 패턴을 찾으면 됩니다.

 

 

 그러면 길이가 2000 이상인 패턴이 출력되지 않습니다.

 


 이제 14번째 줄에 가희tomcat이라고 입력한 후에 저장하겠습니다.

 

 

 그리고 test.log에서 tomcat이라는 결과를 찾은 것 중에, 길이가 1이상 10인 것을 찾아 봅시다. 저는 가희tomcat이 출력될 줄 알았습니다만, 가희tomcat이 출력되지 않았음을 볼 수 있습니다. 어떻게 해야 할까요?

 

 


 [^\n]은 문자 집합 \n을 제외한 패턴을 의미합니다. 그러므로 ^[^\n]\{1,8\}$ 패턴을 입력하면 될 거 같습니다. BRE 패턴에서는 그렇습니다.

 

 같은 명령어로 입력하였는데, root 쉘에서는 가희tomcat이 출력되었습니다. 심지어, tomcat가희도 출력되었습니다. 그런데, 다른 쉘에서 저 명령을 치면, 가희tomcat과 tomcat가희가 뜨지 않습니다. 이는 왜 그럴까요? locale을 쳐 보면 알 수 있습니다.

 

 

 둘의 환경변수가 다름을 알 수 있습니다. 어떻게 해야 할까요? language를 ko_kr로 설정해 볼까요? 계정의 .profile 파일에 export LANG=ko_KR.utf8을 추가해 줍니다.

 

 그리고, source 명령어로 변경 사항을 저장합니다.

 

 

 그러면 locale이 한국 기준으로 변경되었음을 알 수 있습니다. 이제 tomcat이 나오는 라인 중에 \n을 제외한 다른 문자가 1회 이상 8회 이하 반복되는 패턴을 출력해 보겠습니다.

 

 

 이를 통해, grep은 locale 설정에 상당히 민감하다는 것을 알 수 있어요. 이는 grep의 공식 문서에도 나와 있는 부분이니 관심이 있으면 참고해 보시는 것도 좋을 듯 싶습니다.