가장 효율적인 grep 방법

가장 효율적인 grep 방법

현재 다음 중 하나가 포함된 파일에서 데이터를 추출하고 있습니다.

342163477\|405760044\|149007683\|322391022\|77409125\|195978682\|358463993\|397650460\|171780277\|336063797\|397650502\|357636118\|168490006...............

목록은 길며 약 700개의 서로 다른 값을 포함합니다.

가장 효율적인 추출 방법은 무엇입니까? 10/20/50/100 부분으로 나눌 수 있나요? 아니면 다른 유닉스 방식이 있나요? 이 grep은 추가 분석을 위해 Python으로 파이프되며 이는 충분히 빠릅니다.

답변1

이 숫자를 모두 파일에 숫자당 한 줄씩 입력하고 또는 스위치와 grep함께 사용하세요 .-f--file=

grep -f filewithcodestosearchfor filetosearchin

답변2

플래그를 사용해 보셨나요 --mmap?

남성의 경우:

   --mmap If possible, use the mmap(2) system call to read input, instead
          of the default read(2) system call.  In some situations, --mmap
          yields better performance.  However, --mmap can cause undefined
          behavior (including core dumps) if an input file shrinks while
          grep is operating, or if an I/O error occurs.

답변3

파일에 넣는 대신 다음을 수행할 수 있습니다.

grep -F '342163477
405760044
149007683
322391022
77409125
195978682
358463993
397650460
171780277
336063797
397650502
357636118
168490006' file

다시 말하지만, 이것은 또한 이식 가능/표준입니다(BRE에서 사용되는 grep -Ff것처럼\|grep아니요표준/휴대용).

또한, 진짜 문제는 무엇인가? 이 숫자가 포함된 행을 가져오시겠습니까? 아니면 파일에 어떤 숫자가 나타나는지 알고 싶으십니까? 파일이 정렬되어 있나요? 파일의 각 줄에 숫자가 있습니까? ...

답변4

다른 답변에 대한 의견에서 언급했듯이 grep -F가능하면 /를 사용하십시오. fgrep이는 모든 정규식 문자를 리터럴로 처리합니다. 이 옵션과 결합 -f file하고 패턴을 한 줄에 한 패턴씩 파일에 넣으면 교대 효과를 얻을 수 있습니다.

정규식을 포함하는 패턴이 필요한 경우 클래식 ERE 구문으로 제한하고 grep -E/ 를 사용해 보세요 egrep. 클래식 ERE 구문에는 역참조가 포함되어 있지 않으므로 다음과 같은 형식의 패턴이 없습니다 ...(pat)...\1.... 이는 아마도 DFA를 사용하여 일치를 수행하고 더 효율적일 것입니다. 그러나 이는 egrep 구현에 따라 다릅니다. 이에 대한 추가 논의는여기. 일부 egrep 구현(예: Gnu)은 역참조가 있는 패턴을 허용하지만 이러한 패턴을 일치시킬 때 여기에 언급된 효율성 이점은 확실히 발생하지 않습니다.

이론적 관심을 위해 최적화에 대해 언급합니다 egrep. 의도한 사용에 도움이 되는지 테스트해 볼 가치가 있기 때문입니다. manatwork가 말했듯이 Gnu의 grep 엔진은 당신보다 최적화 방법을 더 잘 알아내는 것 같습니다.

관련 정보