Linux_utils_grep
리눅스에선 유용한 유틸리티들이 많이 있습니다. 그 중 ‘grep’은 “Global Regular Expression Print”의 약자로, 파일에서 특정한 패턴을 검색하는 명령어 입니다. ‘grep’ 명령어를 사용하면 파일 내에서 원하는 문자열 또는 패턴을 찾을 수 있습니다. 이번 포스트에선 ‘grep’에 대한 사용 방법과 ‘정규표현식’에 대해 정리하고자 합니다.
사용방법
문구는 “grep [option]… pattern [file]…” 입니다. 여러 개의 옵션과 파일을 사용할 수 있습니다. pattern은 ‘정규표현식’이 올 수 있으며 디폴트 옵션인 ‘basic regexp’을 사용할 수 있습니다.
Option
‘확장된 정규표현식’을 쓰고 싶다면 옵션으로 ‘-E’를 주거나, egrep 명령어를 사용하면 됩니다. 정규표현식 메테문자를 사용하고 싶지 않다면 ‘-F’ 옵션을 사용하거나, fgrep을 사용하면 됩니다.
정규표현식 해석기 선택 옵션 이외에도, 자주 사용하는 옵션으로는 ‘-c’, ‘-n’, ‘-i’, ‘-v’ 등이 있습니다. ‘-c’ 옵션은 매칭된 라인을 출력하지 않고, 매칭된 라인 수만 출력합니다. ‘-n’ 옵션은 매칭된 라인이 출력될 때, 파일상의 라인 번호도 함께 출력됩니다. ‘-i’ 는 패턴에 사용되는 문자열의 대소문자를 구분하지 않고 검색합니다. ‘-v’ 는 패턴과 매칭되지 않은 라인만 출력합니다.
정규표현식
제가 실습할 때, 실수했던 부분들을 정리하고자 합니다. 실수했던 부분은 다음과 같습니다. 정규표현식의 메타 문자와 리눅스에서 제공하는 메타 문자는 동일한 문자지만 의미는 다르다는 것입니다. 리눅스에선 ‘와일드 카드’라고 불리는 유용한 메타 문자들을 제공합니다. 리눅스 와일드 카드는 file명 또는 directory명을 검색할 때 사용되는 패턴 문자입니다. 정규표현식 메타 문자와 구별해야 하는 와일드 카드로는 ‘*’, ‘?’가 있습니다. 와일드 카드로 쓰이는 ‘*‘는 모든 문자열을 매치해주고, ‘?’은 모든 문자를 매치해줍니다.
실습을 했을 때, ‘grep a* file’과 ‘grep ‘a*’ file’에서 다른 결과값을 얻을 수 있었습니다. 첫 번째 명령 구문을 사용했을 때는 쉘 해석기가 에스터리스크를 와일드 카드로 인식했습니다. 이러한 모호함을 삭제하기 위해서 ‘grep’ 명령어를 사용할 때, pattern을 ‘’ 혹은 ““(변수치환이나 명령치환을 사용할 경우)에 감싸서 사용하는 것이 일반적으로 좋다고 생각합니다.
기본 정규표현식
메타 문자 | 설명 |
---|---|
. | 어떤 한 문자와 매치 |
* | 앞의 문자가 0번 이상 나타남 |
^ | 라인의 시작 |
$ | 라인의 끝 |
[ ] | 문자 집합 중 하나 |
\ | 이스케이프 문자 |
\{m\} | 앞의 문자가 정확히 m번 나타남 |
\{m, n\} | 앞의 문자가 m번 이상, n번 이하 나타남 |
확장된 정규표현식
메타 문자 | 설명 |
---|---|
. | 어떤 한 문자와 매치 |
* | 앞의 문자가 0번 이상 나타남 |
+ | 앞의 문자가 1번 이상 나타남 |
? | 앞의 문자가 0번 또는 1번 나타남 |
^ | 라인의 시작 |
$ | 라인의 끝 |
[ ] | 문자 집합 중 하나 |
[^ ] | 부정 문자 집합 |
\ | 이스케이프 문자 |
| | OR 연산자 |
() | 그룹화 |
{m} | 앞의 문자가 정확히 m번 나타남 |
{m, n} | 앞의 문자가 m번 이상, n번 이하 나타남 |