`grep`,`egrep` 및`fgrep`의 차이점은 무엇입니까?


답변:


292

역사적으로 이러한 스위치는 별도의 바이너리로 제공되었습니다. 정말 오래된 유닉스 시스템에서는 별도의 바이너리를 호출해야하지만 모든 최신 시스템에서는 스위치가 선호됩니다. grep 매뉴얼 페이지에 이에 대한 세부 사항이 있습니다.

그들이하는 일에 관해서는, -Egrep을 특수 모드로 전환하여 표현식이 일반적인 패턴 일치와 달리 ERE (Extended Regular Expression)로 평가됩니다. 이 구문에 대한 자세한 내용은 매뉴얼 페이지에 있습니다.

-E, --extended-regexp
PATTERN을 확장 정규식으로 해석

-F스위치는 일치하는 패턴을 받아들이는 다른 모드로 그렙 전환, 그러나 한 줄에 하나의 검색 문자열에 그 패턴을 분할하고 특별한 패턴 매칭을 수행하지 않고 문자열의에 대해 OR 검색을 수행합니다.

-F, --fixed-strings
PATTERN을 줄 바꿈으로 구분 된 고정 문자열 목록으로 해석하십시오.

시나리오 예는 다음과 같습니다.

  • 10 개의 Unix 사용자 이름 목록이 일반 텍스트로 된 파일이 있습니다. 머신에서 그룹 파일을 검색하여 나열된 10 명의 사용자 중 하나가 특수 그룹에 있는지 확인하려고합니다.

    grep -F -f user_list.txt /etc/group
    

    -F스위치가 여기서 도움 이되는 이유는 패턴 파일의 사용자 이름이 일반 텍스트 문자열로 해석되기 때문입니다. 예를 들어 점은 와일드 카드가 아닌 점으로 해석됩니다.

  • 멋진 표현을 사용하여 검색하고 싶습니다. 예를 들어 괄호 ()|사용하여 OR 연산자 로 사용되는 그룹을 나타낼 수 있습니다 . 다음을 사용하여이 검색을 실행할 수 있습니다 -E.

    grep -E '^no(fork|group)' /etc/group
    

    ... "nofork"또는 "nogroup"으로 시작하는 행을 반환합니다. -E스위치가 없으면 일반적인 패턴 일치를 사용하면 정확한 패턴 만 검색하므로 관련된 특수 문자를 이스케이프해야합니다.

    grep '^no\(fork\|group\)' /etc/group
    

17
일부 시스템에는 egrep또는 이 없습니다 fgrep; -E-F표준입니다. 실제로 작은 비 호환성이 있습니다 egrep: {약간 다르게 취급합니다 .
Gilles

4
fgrepAho-Corasick 백엔드를 grep사용하고 Commentz-Walter의 수정 된 버전 을 사용합니다. 이는 grep최악의 경우 O (mn) 복잡성 을 가지지 만 최악 fgrep의 O (m + n) 임을 의미합니다 .
Slater Victoroff

2
질 "AU 반대가 월 캐피", 일부 시스템 (오래된 아마도) 표준 그렙에 -F 옵션이 있지만, fgrep, 일부 PPL 내가 특수 문자 그렙 사용에 대한 발견 원래 스레드에서 그것에 대해 불평이 없을 수 있습니다
THESorcerer

나는 최근에 안드로이드 시스템에서 일 egrep했고 grep -EBusyBox와 BSD grep과 같은 다른 실행 파일에 의해 처리되었습니다. 두 변형은 Posix가 아닌 정규 표현식 구조와 같은 동작 차이를 가졌습니다 \s. 이로 인해 많은 혼란이
생겼습니다

33

보낸 사람 man grep:

 egrep는 grep -E와 동일합니다.
 fgrep는 grep -F와 동일합니다. egrep 또는  
  fgrep는 더 이상 사용되지 않지만 과거 응용 프로그램을 허용하도록 제공됩니다.
  수정되지 않은 상태로 실행하는 데 의존합니다.

당신은 사용 fgrep또는 grep -F당신이 경우 하지 않습니다 원하는 grepped 문자열은 패턴으로 해석 될 수 있습니다.

당신이 사용 egrep하거나 grep -E필요한 경우 확장 된 정규 표현식을 사용합니다.


13

egrepfgrep동등 기본적으로 있습니다 grep -Egrep -F(각각) :

   -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).  (-E is specified by POSIX.)

   -F, --fixed-strings
          Interpret  PATTERN  as  a  list  of  fixed strings, separated by
          newlines, any of which is to be matched.  (-F  is  specified  by
          POSIX.)

오류 메시지는 다를 수 있습니다.


2
좋아,하지만 입니다 확장 된 정규 표현식은? 아래에 실제로 설명되어 있지 않습니다. 몇 가지 예가 좋을 것입니다 ...
동 형사상

@isomorphismes :이 위키 북 링크 는 그것을 잘 설명합니다 ...
zb226

8

"남자 grep"에서 :

세 가지 변형 프로그램 (예 : rep, fgrep 및 rgrep)을 사용할 수 있습니다. egrep는 grep -E와 동일합니다. fgrep는 grep -F와 동일합니다. rgrep는 grep -r과 동일합니다. egrep 또는 fgrep와 같은 직접 호출은 더 이상 사용되지 않지만이를 사용하는 히스토리 애플리케이션은 수정되지 않은 상태로 실행할 수 있습니다.


2
이 질문은 적절한 예를 요구합니다.
동 형사상

3

완전 문자열을 검색하고 전달한 문자열이 완전하게 해석되도록하려면 (예 : 점 또는 물음표가 다른 것으로 해석 될 위험이없는 경우) fgrep 또는 egrep -F를 사용하십시오.

egrep과 grep의 차이점은 egrep이 대부분 원하는 것입니다. GNU 매뉴얼 사이트 에는 grep과 egrep의 차이점이 구문에 나와 있습니다. egrep이 perl regexp 및 javascript regexp와 더 "호환"되므로 egrep을 사용하는 것이 더 쉽습니다.

Btw. 나는 당신에게 ack 을 시도해 볼 것을 권장 한다-PREG를 지원하고 더 유용한 기본값을 가지고있다 (예 : 채색, .svn과 같은 원하지 않는 디렉토리를 건너 뛰기, 심볼릭 링크를 따르는 능력, 타이핑하기가 조금 더 쉽다) grep -E보다 ack).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.