grep, egrep…???

이 둘의 차이는, 확장 Regex(extended regular expressions) 가 지원되느냐 마느냐이다. 이게 또 뭔 소린가 하면..

간단하게 말해서, . 을 그냥 문장부호 .(즉, Pattern) 으로 인식할지, 아니면 모든 문자(즉, Metacharacter 역할)를 뜻할지를 결정해준다.

그냥 grep 면 . 은 Pattern 이고, egrep 면 Metachracter 가 된다.

그런데.. 다음과 같이하면 오류가 발생한다.

$ history | egrep -P '.[0-9]+\s+\Kssh\s'
grep: conflicting matchers specified

왜?? 왜 이런 오류가..? 게다가 뭔 뜻이래?

matcher 에 충돌했다는 얘긴데..


이걸 알아내기까지 약 20분여가 걸렸다.

먼저, egrep 라는 꾸러미는 ‘없다’는 사실을 알아야 한다. egrep 는 그냥 grep 에 -E 를 붙여 쓰는 형태지, 따로 존재하는 프로그램이 아니다.
확인할 방법은?

➜  ~ cat /usr/bin/egrep 
#!/bin/sh
exec grep -E "$@"

➜  ~ cat /bin/egrep 
#!/bin/sh
exec grep -E "$@"

백문이 불여일견.

따라서, egrep -P 는 당연히 오류가 발생할 수 밖에 없다. -E 와 -P 는 동시에 사용할 수 없는 상황이니 말이다.

옳게 사용하려면, egrep -P 가 아니고, grep -P 를 사용해줘야 한다.
애초에 -P 는, Perl 의 \K 를 사용하기 위해 필요했었는데..

이쯤되면, pgrep 는 왜 없을까 궁금해진다.

➜  ~ ll /usr/bin/?grep 
-rwxr-xr-x 1 root root   28 2020-01-29 18:31 /usr/bin/egrep
-rwxr-xr-x 1 root root   28 2020-01-29 18:31 /usr/bin/fgrep
-rwxr-xr-x 1 root root  31K 2020-02-27 14:52 /usr/bin/pgrep
-rwxr-xr-x 1 root root   30 2020-01-17 00:27 /usr/bin/rgrep
-rwxr-xr-x 1 root root 7.5K 2019-12-14 00:41 /usr/bin/zgrep

어라? pgrep 가 있네??

그/러/나!
pgrep 에서 p 는 Perl 이 아니고, Process 다. 따라서 grep 와는 별 관계가 없다.

정 필요하다면, alias 로 하나 만들면 될 듯.

alias pcre='grep -P'

이런 식으로?

Tags:,

안녕하세요. 글 남겨주셔서 고맙습니다.