특정 패턴을 캡처하려면 awkgrep를 사용할 수 있습니다. 왜 우리는 다른 하나를 사용해야합니까? 어느 것이 더 빠르고 그 이유는 무엇입니까?

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

awk "/pattern/" /var/log/messages 

또는

grep "pattern" /var/log/messages 

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

설명

  • 모든 명령, 심지어 쉘 스크립트 앞에 time 명령은 명령을 실행하는 데 걸리는 시간을 측정합니다. 예 : time ls -l.

답변

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 코드 프로그램입니다 (파일에서 패턴을 찾는 데 추가로 최적화 됨). .

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

해석 된 언어에 대한 자세한 내용 on wikipedia.

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

댓글

  • 사용중인 grep 또는 awk 구현을 말하지 않고 ' 어떤 컴퓨터 아키텍처와 어떤 시스템 문자 집합을 사용하는 경우 이러한 타이밍은 거의 가치가 없습니다.
  • 두 번째 명령도 새로 캐시 된 버전. 나는 grep이 더 빠르다는 것을 의심하지 않지만 당신의 숫자가 보여주는 것만 큼은 아닙니다.
  • (따라서 awk, grep, awk, grep를 실행하고 awk 및 grep의 두 번째 세트의 결과를 게시합니다. 🙂 및 FYI , 저는 UTF8 로케일에 살고 있습니다.
  • 재미있다. BSD 도구 (Mac)를 사용하면 awk (31.74s)가 sed (33.34s)보다 약간 빠르며 grep ( 34.21s). Gnu awk는 5.24 초에 모두 소유하고 있습니다. ' gnu grep이나 테스트 할 sed가 없습니다.
  • awk는 각각에 대해 더 많은 작업을 수행하므로 grep이 약간 더 빠릅니다. 입력 줄에 정규식을 검색하는 것보다 필드가 스크립트에서 참조되는 경우 (이 경우에는 ' ') awk는 필드 구분자 값을 기반으로 각 입력 행을 필드로 분할하고 내장 변수를 채 웁니다. 하지만 게시 한 내용에는 거의 차이가 없습니다. grep과 awk wrt 일치 정규 표현식의 가장 중요한 차이점은 grep이 일치하는 문자열을 찾기 위해 전체 행을 검색하는 반면 awk는 특정 필드를 검색 할 수 있으므로 더 정확하고 잘못된 일치를 더 적게 제공한다는 점입니다.

답변

가장 구체적이고 표현력이 풍부한 도구를 사용하십시오. 사용 사례에 가장 적합한 도구가 가장 빠를 것입니다.

대략적인 가이드 :

  • 하위 문자열 또는 정규 표현식과 일치하는 줄을 검색 하시겠습니까? grep을 사용하세요.
  • 단순하게 구분 된 파일에서 특정 열을 선택 하시겠습니까? cut을 사용합니다.
  • 패턴 기반 대체를 수행하거나 … sed가 합리적으로 할 수있는 다른 작업을 수행합니까? sed를 사용하세요.
  • 위의 3 가지 조합, printf 형식 또는 범용 루프 및 분기가 필요합니까? awk를 사용합니다.

댓글

  • +1 제외 perl 대신 awk. grep / cut / sed보다 더 복잡한 것이 필요하면 기회를 잡을 수 있습니다. ' 충분하지 않으며 " 충분한 것이 필요합니다. -blown "
  • @sds 대신 python을 사용하지 않는 이유
  • @RetroCode : python이 더 많습니다. " 범용 "; 동등한 한 줄짜리는 아마도 훨씬 더 길어질 것입니다.
  • @sds 아니요, ' ' 텍스트 처리 이외의 작업을 수행합니다. awk는 grep / cut / sed보다 복잡하고 ' 텍스트 처리 작업에 적합하며, 펄과는 달리 모든 UNIX 설치에서 표준으로 제공됩니다.

답변

문자열 만 검색하고 속도가 중요한 경우 거의 항상 grep. 전체 검색에 관해서는 awk보다 훨씬 빠릅니다.

출처 sed, awk 및 기타 Unix 구문 분석 유틸리티의 기능 및 성능 차이

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 

댓글

  • 이러한 모든 프로그램의 멋진 개요에 감사드립니다. 정말 어둠 속에서 빛을 비 춥니 다.
  • ~ headtilt ~ PHP는 있지만 Perl은 ' t?
  • 어떤 grep 및 어떤 awk를 참조하고 있습니까?
  • 그것 '는 grep이 검색하고 대체하는 다른 유틸리티와는 맞지 않습니다.
  • 그것들은 완전히 가짜 번호입니다. 사과와 오렌지를 비교하는 것에 대해 이야기하십시오. '는 웹 사이트 A에서 5 초 안에 새 차를 찾을 수 있지만 차는 찾을 수 있다고 말하는 것과 같습니다. , 가격을 협상하고, 대출을 받고, 1 시간 안에 사이트 B에서 자동차를 구매하므로 사이트 A가 사이트 B보다 빠릅니다. 인용 한 기사가 완전히 잘못되었습니다. ' grep, sed 및 awk 사이의 상대적 실행 속도에 대한 설명과 완전히 사실이 아닌 awk ... has PCRE matching for regular expressions도 표시됩니다.

답변

이론적으로는 grepawk보다 빠르다는 데 동의합니다. , 실제로 YMMV는 사용하는 구현에 따라 많이 달라집니다.

여기서 busybox 1.20.0 “s grep 및 awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 on ASCII 전용 문자 250 만 줄의 240MB 파일에 UTF-8 로케일의 Debian / Linux 7.0 amd64 (glibc 2.17 포함).

$ 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 

In C 로케일, GNU grep 만 크게 향상되고 mawk보다 빨라집니다.

데이터 세트, 정규 표현식 유형도 큰 차이를 만들 수 있습니다. 정규 표현식의 경우 awkawk “의 정규 표현식이 확장 RE이므로 grep -E와 비교되어야합니다. .

이 데이터 세트의 경우 awk는 busybox 기반 시스템 또는 iv id가있는 시스템에서 grep보다 빠를 수 있습니다. = “9adf7e2c4e”>

는 기본 awk이고 기본 로케일은 UTF-8 기반입니다 (IIRC, Ubuntu의 경우 사용).

답변

간단히 말하면 grep는 다른 많은 UNIX 도구와 마찬가지로 한 가지 작업 만 수행합니다. “주어진 패턴에 라인을 일치시키고 잘 수행합니다. 반면에 awk는 POSIX 표준에 의해 정의 된 완전한 프로그래밍 언어로, 변수, 배열, 표현식, 함수 또는 패턴 스캔 및 처리.

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

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다