awk와 grep 비교

awk와 grep 비교

매우 큰 파일에 대해 다음 두 명령을 실행했습니다.

grep -E 'string1|string2' 151103*.log|grep 'string3' | grep string4

awk '/string1|string2/ && /string3/ && /string4/' 151103*.log

실행 시간은 거의 동일합니다. 하지만 awk일치하는 결과가 더 빨리 나타났습니다. grep또한 동일한 결과가 표시되지만 마지막에는 프로세스가 완료됩니다.

두 프로세스 모두 동일한 시간이 소요되며 검색 awk과 그 뒤에 있는 논리가 궁금합니다 grep.

왜 더 빠르나요 awk? 이 두 프로그램은 서로 다른 검색 논리를 가지고 있나요? 위 검색에서 문자열을 난독화하면 검색 속도에 영향을 미치나요?

답변1

GNU는 grep출력을 버퍼링하지만 GNU는 awk버퍼링하지 않습니다. GNU를 사용하지 않고 awk다른 변형을 사용하더라도 터미널에 인쇄하면 여전히 라인 버퍼링되어 있으므로 \newline의 출력은 발생할 때마다 플러시되지만 grep파이프에 쓰면 차단됩니다. 버퍼가 무엇이든. GNU가 있다면 이를 grep사용 grep --line-buffered ... | grep ...하여 비교하여 가능한 한 빨리 결과를 확인할 수 있습니다. 아마도 grep거의 모든 경쟁 테스트 awk, 특히 GNU 에서 이길 것입니다 grep.

이것은 sed또한 당신이 원하는 것을 수행합니다:

sed -ne'/string4/{/string3/s/string[12]/&/p;}' <in >out

답변2

grep 파이프는 string4의 마지막 항목이 무엇인가와 일치할 때까지 아무 것도 출력할 수 없으며 grep이전 파이프 버퍼가 채워진 후에만 입력을 받습니다. 관련 질문 보기파이프 버퍼는 얼마나 큽니까?그리고파이프라인에서 버퍼링 끄기.

입력의 문자열 빈도에 따라 정적 검색을 먼저 배치하여 확장 정규식을 보는 횟수를 줄임으로써 런타임의 차이를 확인할 수 있습니다.

답변3

귀하의 awk 예제는 전체 정규식 검색을 한 번에 수행합니다. 각 입력 줄에 대해 첫 번째, 두 번째 및 세 번째 정규식이 발견되면 해당 줄이 인쇄되고 출력이 즉시 표시됩니다(일치하는 줄이 처리됨).

grep 예제는 동일한 작업을 수행하기 위해 3개의 다른 grep 호출(각 정규식에 대해 하나씩)을 사용하지만 각 호출의 출력은 다음 호출의 입력이 됩니다. 즉, 각 호출은 처리하기 전에 호출을 완료해야 합니다. .

1000행 파일이 있고 5행만 세 정규식 모두와 일치하는 경우 awk 명령은 5행이 처리된 후 6행이 처리되기 전에 출력을 제공합니다. 이를 파이프라인 grep 문과 비교해 보세요. grep의 첫 번째 호출은 라인 5 및 첫 번째 정규식과 일치할 수 있는 다른 모든 라인을 찾고, 입력의 1000번째(마지막) 라인을 처리한 후 출력은 grep 입력의 두 번째 호출이 됩니다. grep에 대한 두 번째 호출은 첫 번째 출력의 행만큼 처리하고 첫 번째 및 두 번째 정규식과 일치하는 행을 출력합니다. 그런 다음 grep에 대한 세 번째 호출의 입력이 됩니다. 각 줄을 처리하기 위해 grep이 세 번째 호출되면 정규식과 일치하는 모든 줄이 출력됩니다.

위의 예에서 grep의 최고 사례와 최악의 사례를 비교할 수 있습니다. 행 5를 제외하고 어떤 정규식과도 일치하는 행이 없으면(5개 행 모두 일치) 첫 번째 grep은 1000행을 처리하고 두 번째 One grep은 1행을 처리하며, 세 번째 grep은 1줄을 처리합니다. 출력을 생성하기 전에 1002줄(최상의 경우)을 처리합니다. 모든 줄이 처음 두 정규식과 일치하지만 단 한 줄만 세 번째 정규식과 일치하는 경우 파이프라인 grep 구성은 5번 줄과 일치하는 항목을 찾기 전에 1000 + 1000 줄 + 5 = 2005 줄을 처리하고 일부 출력을 생성합니다. 두 번째 grep 출력에는 나머지 995줄이 있지만 일치하는 항목이 없기 때문에 더 이상 출력이 표시되지 않습니다.

이것을 각 라인의 세 정규식을 모두 동시에 확인하고 라인 5를 처리한 후 출력을 제공하는 awk 명령과 비교해 보세요. 동시에 더 많은 파일을 확인할수록 차이는 더 커집니다.

예를 들어, 위와 동시에 모든 파일에 대해 grep 명령을 실행하는 것보다 더 빠른 출력이 표시되는지 비교합니다(이론적으로는 이렇게 해야 하지만 결과는 파일 전체의 적중 분포에 따라 달라질 수 있음).

grep -E 'string1|string2' 151103*.log|grep 'string3' | grep string4

다음과 같이 각 파일에 대해 일련의 grep 명령을 개별적으로 실행할 수 있습니다.

for i in 151103*.log; 
  do grep -E 'string1|string2' $i |grep 'string3' | grep string4; 
done

여전히 awk 문만큼 빠르게 출력이 생성되지는 않지만 차이를 볼 수 있습니다.

답변4

유사한 작업에 grep, awk 및 sed를 사용할 수 있지만 각각 장점과 단점이 있습니다.

Awk는 표 형식의 데이터나 계산 등을 수행해야 하는 경우에 가장 적합합니다.

Sed는 텍스트를 바꾸는 데 능숙합니다.

Grep은 입력 데이터에서 행을 선택하는 데 가장 효과적이므로 awk보다 더 빠르게 수행하고 싶습니다. 아마도 3개의 grep 명령을 하나로 결합하면 다음과 같은 결과가 나타날 것입니다. 이제 grep은 세 번 시작해야 하고, 두 번째와 세 번째는 첫 번째 입력을 기다려야 하기 때문에 불리한 상황에 처해 있습니다. 이는 결과가 지연되는 이유를 설명할 수 있습니다. 그래도 그것에 대해 잘 모르겠습니다.

관련 정보