개행 문자를 사용하는 grep이 더 빠르나요?

개행 문자를 사용하는 grep이 더 빠르나요?

개행 문자가 제거된 "정규화된 형식"으로 변경된 대용량 파일이 있습니다. 이 파일의 속도를 높이고 싶습니다. 다음을 수행하여 grep을 최적화할 수 있다는 것을 알고 있습니다 grep 'partofpattern' | grep -E 'partofpattern [[:digit:]]+'. 즉, grep이 패턴의 더 단순한 부분을 포함하는 행을 검색하도록 한 다음, 패턴 부분을 포함하는 몇 개의 행에서 grep을 두 번째로 실행하도록 합니다. 이것은 grep이 어떻게든 한 줄씩 작동한다고 생각하게 만듭니다. 그렇다면 개행 없이 큰 파일에 개행을 추가하면 grep 속도가 빨라질까요?

답변1

아마도 fmt둘 중 하나를 사용해야 할 것입니다 . 이것은 :foldprfmt

until [ $((i=i+1)) -gt 10000 ]
do  printf %s\  words and more words
done | fmt

산출

words and more words words and more words words and more words words
and more words words and more words words and more words words and more
words words and more words words and more words words and more words
words and more words words and more words words and more words words
and more words words and more words words and more words words and more
#...and so on for a long time

grep버퍼는 개행 경계에 버퍼를 덤프할 수 없는 한 심각한 로드 하에서 무너질 수밖에 없습니다.

예를 들어:

time (
    tr \\0 \\n < /dev/zero | 
    sed 'c words and words and words and words and words and' | 
    tr -d \\n | 
    grep -o words
)
grep: memory exhausted
49.42s user 44.93s system 229% cpu 41.070 total

시간이 좀 걸렸지만 시스템에 빈 RAM이 많았고 여전히 1분 이내에 충돌이 발생했습니다.

그래서 그냥:

fmt <file | grep search

그래도 파일에 신뢰할 수 있는 단일 문자열 구분 기호가 있으면 더 안정적입니다.

tr ${delim} \\n <file | grep search

답변2

grep은 sed와 마찬가지로 확실히 라인 기반으로 작동할 수 있습니다. 검색 속도가 반드시 빨라지는 것은 아니지만 일치하는 줄의 출력을 생성하는 것이 더 빨라야 합니다.

관련 정보