grep 및 awk 사용

grep 및 awk 사용

특정 패턴을 포착하여 awk사용할 grep수 있습니다. 왜 우리는 다른 것을 사용해야합니까? 어느 것이 더 빠르며 그 이유는 무엇입니까?

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

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

또는

grep 'pattern' /var/log/messages

벤치마킹을 해본 적이 없어서 잘 모르겠습니다. 누군가 이것에 대해 자세히 설명해 주시겠습니까? 두 도구의 내부 작동 방식을 아는 것이 좋습니다.

답변1

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을 사용하세요.
  • 단순 구분 파일에서 특정 열을 선택하시겠습니까? 절단을 사용하십시오.
  • 패턴 기반 대체를 수행하거나... sed가 합리적으로 수행할 수 있는 다른 작업을 수행합니까? sed를 사용하세요.
  • 위의 3가지 조합, printf 형식, 일반 루프 및 분기가 필요합니까? awk를 사용하세요.

답변3

문자열만 검색할 때는 거의 항상 사용해야 하며 대략적인 검색보다 속도가 훨씬 빠릅니다 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

답변4

간단히 말해서, grep다른 많은 UNIX 도구와 마찬가지로 주어진 패턴에 줄을 일치시키는 한 가지 작업을 수행하며 이를 잘 수행합니다. 반면에 awkPOSIX 표준에 의해 정의된 완전한 프로그래밍 언어이며 패턴 검색 및 처리를 위한 변수, 배열, 표현식, 함수 또는 제어문과 같은 일반적인 기능을 갖추고 있기 때문에 더 복잡한 도구입니다.

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

관련 정보