대소문자 구분없이 grep을 이용해서 matched 되는 줄을 찾는 방법을 알아봅시다.

 


  grep의 man 페이지를 보면 -i, --ignore-case라고 되어 있습니다. 이는, 대소문자의 다름을 무시한다는 이야기입니다.

 

 

 sample.txt를 보겠습니다. 여기에는 5개의 줄로 이루어진 데이터가 들어 있습니다.

 

 

 여기서, grep group을 뽑으면, 이렇게 2개의 줄만 matched 됩니다. 이는, GROUP은 대소문자를 엄격하게 구분한다면, group이 아니기 때문입니다. 이것을 무시하기 위해서 -i 옵션을 줘 보겠습니다.

 

 

 그러면, GROUP 또한 매치가 됨을 알 수 있습니다. 이런 옵션은 다른 명령어에서도 유용하게 쓰일 수 있습니다. 예를 들어서, 현재 제가 있는 위치인 /home/cho을 기준으로 해서 name에 in으로 시작하는 패턴을 찾아보겠습니다.

 

 

 그러면, /home/cho 안에 있는, in.txt만 걸립니다.

 

 

 그런데, -iname 옵션을 주면 In.txt도 걸립니다. 이는, -iname이 대소문자 구분 없이 매치시키는 옵션이기 때문입니다.

 


 이런 질문이 들어오면 어떤가요? 대소문자 구분 없는 group 패턴이 나오거나, 대소문자 구분하는 gianT가 나오거나. 이런 것은 생각보다 까다로운데, 일단, 대소문자 구분이 없다면, g는 g가 와도 되고, G가 와도 됩니다. 그리고 2번째 패턴은 r이나 R이 와도 됩니다. 3번째는 o나 O, 4번째는 u나 U, 5번째는 p나 P가 오면 됩니다.

 

 

 그러면 이런 식으로 작성하실 수 있습니다. 여기서 [gG]는 올 수 있는 문자 집합을 의미합니다. [gG]는 g나 G가 올 수 있다는 것이고, [oO]는 o나 O가 올 수 있다는 의미입니다. 중요한 것은 '^[gG][rR][oO][uU][pP]$'와 같이 작성하지 않았다는 건데, 이것은 정확하게 대소문자 구분 없는 group을 의미합니다.

 

 

 다음에 gianT도 패턴에 일치시켜야 한다고 그랬습니다. 그러면, 대소문자 구분 없이 group이 오거나, 아니면 gianT가 오거나이므로, regex에서 or를 뜻하는 |으로 연결해 주면 됩니다. 그러면 Lotte gianT도 같이 걸리는 것을 볼 수 있습니다. 그러면 대소문자 구분없이 group도 걸리고, giant도 걸리는 line만 출력하려면 어떻게 하면 좋을까요?

 

 grep이 패턴을 만족하는 것만 내보내기 때문에, grep -i group을 한 결과를 piping 해서, grep -i giant를 하면 됩니다.

 

 

  대소문자 구분 없이 sample.txt에서 group만을 뽑았습니다.

 

 

 여기서 giant 대소문자 구분 없이 뽑아내면 되므로, 한 번 더 파이핑 해서 연결해 주시면 됩니다.

댓글을 달아 주세요