grep vs awk 사용


17

특정 패턴을 캡처하려면, awkgrep사용할 수 있습니다. 왜 우리는 서로를 사용해야합니까? 어느 것이 더 빠르며 왜?

로그 파일이 있고 특정 패턴을 잡고 싶다면 다음 중 하나를 수행 할 수 있습니다

awk '/pattern/' /var/log/messages

또는

grep 'pattern' /var/log/messages

벤치마킹을 수행하지 않았으므로 알 수 없습니다. 누군가 이것을 자세히 설명 할 수 있습니까? 이 두 도구의 내부 작동을 아는 것이 좋습니다.


명령 time을 실행하는 데 걸리는 시간을 정하는 명령을 사용하여 명령 ( 셸 스크립트까지 포함)을 선행하십시오 . 예 : time ls -l.
Bulrush

답변:


26

grep이 더 빠를 것입니다.

# time awk '/USAGE/' imapd.log.1 | wc -l
73832

real    0m2.756s
user    0m2.740s
sys     0m0.020s

# time grep 'USAGE' imapd.log.1 | wc -l
73832

real    0m0.110s
user    0m0.100s
sys     0m0.030s

awk는 해석 된 프로그래밍 언어이며, grep은 컴파일 된 c 코드 프로그램 (파일에서 패턴을 찾는 데 추가로 최적화 됨)입니다.

(참고-캐싱으로 인해 결과가 왜곡되지 않도록 두 명령을 두 번 실행했습니다.)

위키 백과의 해석 언어 에 대한 자세한 내용

Stephane이 코멘트에서 올바르게 지적했듯이, 사용하는 grep 및 awk, 운영 체제 및 운영중인 문자 집합의 구현에 따라 마일리지가 다를 수 있습니다.


2
어떤 grep 또는 awk 구현을 사용하는지, 어떤 컴퓨터 아키텍처 및 어떤 시스템 문자 세트를 사용하는지 말하지 않고 이러한 타이밍은 가치가 거의 없습니다.
Stéphane Chazelas

1
두 번째 명령은 새로 캐시 된 버전도 사용합니다. 나는 grep이 더 빠르지 만 당신의 숫자가 보여주는 것만 큼은 아니라는 것을 의심하지 않습니다.
exussum

(따라서 awk, grep, awk, grep을 실행하고 두 번째 awk 및 grep 세트의 결과를 게시합니다.)와 FYI는 UTF8 로켈에 있습니다.
Drav Sloan

1
BSD 도구 (Mac의 경우)에서 awk (31.74s)는 sed (33.34s)보다 약간 빠르며 grep (34.21s)보다 약간 빠릅니다. Gnu awk는 5.24에서 모든 것을 소유하고 있습니다. 나는 gnu grep이나 sed가 없습니다.
Kevin

1
grep은 awk가 정규 표현식을 검색하는 것보다 각 입력 줄에서 더 많은 것을 수행하기 때문에 약간 더 빠릅니다. 예를 들어 스크립트에서 필드가 참조되는 경우 (이 경우에는 그렇지 않습니다) awk는 필드 구분자 값과 내장 변수를 채 웁니다. 그러나 게시 한 내용과 거의 차이가 없습니다. 지금까지 AWK 특정 필드를 검색하고 그래서 더 정확하고 더 적은 거짓 일치를 제공 할 수있는 반면 그렙 및 AWK WRT 매칭으로 정규 표현식 사이의 가장 중요한 차이점 일치하는 문자열이 그렙 검색 전체 라인이다.
Ed Morton

14

가장 구체적이고 표현력있는 도구를 사용하십시오. 사용 사례에 가장 적합한 도구가 가장 빠를 수 있습니다.

대략적인 지침으로 :

  • 하위 문자열 또는 정규 표현식과 일치하는 줄을 찾고 있습니까? grep을 사용하십시오.
  • 간단하게 구분 된 파일에서 특정 열을 선택 하시겠습니까? 컷을 사용하십시오.
  • 패턴 기반 대체를 수행하거나 ... 다른 것들을 합리적으로 수행 할 수 있습니까? sed를 사용하십시오.
  • 위의 3 또는 printf 형식 또는 범용 루프 및 분기의 조합이 필요합니까? awk를 사용하십시오.

perl대신에 +1을 사용하십시오 awk. grep / cut / sed보다 더 복잡한 것이 필요하다면, 기회가 충분하지 않고 "완전한"무언가가 필요합니다
sds

@sds 왜 파이썬 대신에
RetroCode

@RetroCode : 파이썬은 펄보다 "일반적인 목적"입니다. 동등한 원 라이너는 아마도 훨씬 길 것입니다.
sds

3
@ sds 아니오, 텍스트 처리 이외의 작업을 수행하지 않는 한 펄이 필요하지 않습니다. awk는 grep / cut / sed보다 복잡한 텍스트 처리에 적합하며 perl과 달리 모든 UNIX 설치에서 표준으로 보너스가 제공됩니다.
Ed Morton

10

문자열 만 검색하고 속도가 중요한 경우 거의 항상을 사용해야 grep합니다. awk단순히 전체 검색 보다 훨씬 빠릅니다 .

소스 나오지도, AWK와 다른 유닉스 분석 유틸리티의 기능 및 성능 차이를

UTILITY    OPERATION TYPE      EXECUTION TIME     CHARACTERS PROCESSED PER SECOND
                               (10 ITERATIONS)
-------    --------------      ---------------    -------------------------------
grep       search only         41 sec.            489.3 million
sed        search & replace    4 min. 4 sec.      82.1 million
awk        search & replace    4 min. 46 sec.     69.8 million
Python     search & replace    4 min. 50 sec.     69.0 million
PHP        search & replace    15 min. 44 sec.    21.2 million

1
이 모든 프로그램에 대한 훌륭한 개요에 감사드립니다. 그것은 실제로 어둠 속에 빛을 비추고 있습니다.
holasz

1
~ headtilt ~ PHP는 있지만 Perl은 없습니까?
이즈 카타

@ Izkata-나는이 테이블을 얼마 전에 보았을 때도 같은 생각을했습니다.
slm

1
grep이 검색 중이고 교체하는 다른 유틸리티들에게는 실제로 공평하지 않습니다.
Kevin

1
그것들은 완전히 가짜 숫자입니다. 사과와 오렌지를 비교하는 이야기 - 당신이 할 말처럼 단지 가격을 협상, 대출을받을, 그래서 1 시간 사이트 B에 자동차를 구입, 차를 찾을 수있는 반면 5 초에 웹 사이트 A의 새 차를 찾을 수 따라서 사이트 A는 사이트 B보다 빠릅니다. 인용 한 기사는 grep, sed 및 awk 사이의 상대 실행 속도에 대한 설명에서 완전히 잘못되었으며 또한 awk ... has PCRE matching for regular expressions완전히 사실이 아닙니다.
Ed Morton

5

이론 상으로는 실제로 YMMV grep보다 빠르다는 데 동의하지만 awk사용하는 구현에 많이 의존합니다.

여기에서는 2.5M 라인의 240MB 파일에 UTF-8 로켈의 데비안 / 리눅스 7.0 amd64 (glibc 2.17 포함)에서 busybox 1.20.0의 grep 및 awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 비교 ASCII 전용 문자

$ time busybox grep error error | wc -l
331003
busybox grep error error  8.31s user 0.12s system 99% cpu 8.450 total
wc -l  0.07s user 0.11s system 2% cpu 8.448 total
$ time  busybox awk /error/ error | wc -l
331003
busybox awk /error/ error  2.39s user 0.84s system 98% cpu 3.265 total
wc -l  0.12s user 1.23s system 41% cpu 3.264 total
$ time  grep error error | wc -l
331003
grep error error  0.80s user 0.10s system 99% cpu 0.914 total
wc -l  0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error  0.54s user 0.13s system 91% cpu 0.732 total
wc -l  0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error  1.37s user 0.12s system 99% cpu 1.494 total
wc -l  0.04s user 0.07s system 7% cpu 1.492 total
$ time 

C 로켈에서는 GNU grep 만 크게 향상되고보다 빠릅니다 mawk.

정규 표현식의 유형 인 데이터 세트도 큰 차이를 만들 수 있습니다. regexps '에 들어 awk비교해야 grep -E으로 awk의 regexps'에이 확장 된 RE 있습니다.

이 데이터 세트의 경우, 기본이 되고 기본 로케일이 UTF-8 기반 (IIRC, 우분투의 경우) 인 busybox 기반 시스템 또는 시스템 awk보다 빠를 수 있습니다 .grepmawkawk


2

간단히 말해서, grep다른 많은 UNIX 도구와 마찬가지로 한 가지 작업 만 수행하면 주어진 패턴과 일치하는 행을 찾습니다. 반면 awk에 POSIX 표준에 의해 정의 된 완전한 프로그래밍 언어이기 때문에 패턴 스캐닝 및 처리를위한 변수, 배열, 표현식, 함수 또는 제어문과 같은 일반적인 기능을 갖춘보다 복잡한 도구입니다.

내 생각에 그것은 패턴 일치의 경우 두 도구가 어떻게 수행되는지와 처리하려는 일부 입력의 크기에 따라 구현에 달려 있습니다. grep은 보통 awk보다 더 효율적일 것으로 기대합니다. 그러나 다른 도구를 사용하지 않고 일치하는 레코드의 추가 처리, 계산 또는 결과 인쇄와 같은보다 복잡한 작업을 수행하는 간단한 코드를 grep으로 작성할 수 없습니다.

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