이 둘의 차이는, 확장 Regex(extended regular expressions) 가 지원되느냐 마느냐이다. 이게 또 뭔 소린가 하면..
간단하게 말해서, . 을 그냥 문장부호 .(즉, Pattern) 으로 인식할지, 아니면 모든 문자(즉, Metacharacter 역할)를 뜻할지를 결정해준다.
그냥 grep 면 . 은 Pattern 이고, egrep 면 Metacharacter 가 된다.
그런데.. 다음과 같이하면 오류가 발생한다.
$ 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'
이런 식으로?
Perl로 구현된 ack라는 툴이 의외로 강력한 기능을 지원합니다. 옵션 없이 써도 편하더라고요.
https://beyondgrep.com/
좋은 정보 고맙습니다.
ArchLinux 에서도 간단히 설치가 되는군요.