줄이 많은 파일을 많이 grep하시나요?

줄이 많은 파일을 많이 grep하시나요?

a.2014-05-06, a.2014-05-07, a.2014-05-08 등 거대한(30000줄) 파일이 많이 있다고 상상해 보세요.

다음을 사용하여 한 줄의 단어를 찾을 수 있다는 것을 알고 있습니다.

grep "word" a.*

첫째, 단어를 검색하기 위해 두 번째 파일을 열기 전에 각 파일을 열고 닫을 것이라고 생각합니까? 이것이 작동합니까? 그렇지 않다면 더 효율적인 방법이 있습니까?

2. 어떤 파일에서 단어를 찾을 수 있는지 확인하는 방법은 무엇입니까? 예:
a.2014-05-06에 다음이 있는 경우:

a
bx
.
.

a.2014-05-07:

by
.
.

a.2014-05-08:

c
.
.

우리는 다음을 수행합니다:

grep "b" a.*

출력은 다음과 같습니다:

bx
by

나는 다음과 같은 출력을 원합니다 :

bx  a.2014-05-06
by  a.2014-05-07

답변1

~에서man grep:

       -H, --with-filename
           Print the file name for each match.  This is the default when there is
           more than one file to search.

파일 이름을 먼저 인쇄한 다음 일치 항목을 인쇄합니다. 이는 예제 결과에 표시되는 내용이 아닙니다. 하지만 문제가 발생하지 않는다면 빠르고 쉽습니다.

이는 여러 입력의 기본값이므로 와일드카드와 함께 사용하면(예에서와 같이) 다음과 같은 결과가 발생합니다.

$ grep "b" a.*
a.2014-05-06:bx
a.2014-05-07:by

어떤 유형의 Unix/Linux를 사용하고 있는지는 언급하지 않았지만 이 -H옵션은 POSIX 사양에는 없지만 대부분의 구현에서 사용할 수 있습니다.

답변2

모든 파일을 열지 않고 디스크를 검색하려면:

dd if=/dev/${disk_device} |
grep -b 'some regex'

사실 나는 이것을 선호한다:

sudo cat /dev/${some_disk} |
tr -c '[:print:][:space:]' '\n\n' |
grep -b 'some regex'

-b옵션은 일치하는 모든 바이트 오프셋을 제공합니다. 나중에 파일 시스템을 사용하여 이러한 오프셋에 어떤 파일이 있는지 확인할 수 있습니다.

grep두 번째 형식에서는 바이너리 파일 형식에 대한 불만을 피할 수 있습니다.그리고관련 없는 데이터 대신 줄 바꿈을 제공하여 자동으로 검색 속도를 높입니다.

추신 - 파일 시스템 조각 모음이 가능한 경우 먼저 조각 모음을 수행하는 것이 좋습니다.

답변3

첫째, 단어를 검색하기 위해 두 번째 파일을 열기 전에 각 파일을 열고 닫을 것이라고 생각합니까? 이것이 작동합니까? 그렇지 않다면 더 효율적인 방법이 있습니까?

예, grep이 차례로 각 파일을 열고 검색합니다. 대부분의 설정에서는 이것이 가장 효율적인 방법입니다. 정규 표현식이 극도로 복잡하지 않은 한 이 작업은 확실히 I/O에 묶여 있습니다. 즉, 성능 병목 현상은 디스크에서 읽는 것이므로 CPU에 부담을 주지 않습니다.

일부 설정에서는 I/O가 병렬화될 수 있습니다. 예를 들어 RAID-1 또는 RAID-0 구성이 있는 경우 RAID 어레이의 두 개 이상의 구성 요소를 병렬로 읽을 수 있으므로 시간이 절약됩니다. 그러한 설정이 있으면 다음과 같은 도구를 호출할 수 있습니다.GNU 병렬grep을 호출하는 두 가지 인스턴스(명령 예제는 매뉴얼 참조) 대부분의 설정에서 두 개의 grep 인스턴스를 병렬로 호출하면 디스크 헤드가 두 인스턴스에서 액세스하는 파일 사이를 지속적으로 전환하기 때문에 속도가 느려집니다(SSD의 경우 두 인스턴스를 병렬로 호출해도 일반적으로 심각한 속도 저하가 발생하지는 않지만 승리하지는 않습니다). 더 빠르다).

명령줄에 여러 파일을 전달하면 grep은 각 일치 항목 앞에 다음 형식으로 파일 이름을 출력합니다.

path/to/file:line containing a match

와일드카드 패턴이나 다른 형식을 사용하여 파일 이름을 생성하고 일치하는 파일이 있더라도 파일 이름을 표시하려면 grep에게 빈 파일 이름을 검색하도록 지시하세요.빈 장치게다가.

grep REGEX /dev/null *.txt

( grep -H REGEX *.txt비슷하지만 을 사용하면 표준 입력에서 읽는 /dev/null동안 일치하는 파일 목록이 비어 있어도 원활하게 작동한다는 추가 이점이 있습니다 grep -H REGEX.)

답변4

grep큰(또는 많은) 파일을 작업할 때 명심해야 할 두 가지 다른 사항:

  1. 패턴이 아닌 고정된 문자열을 검색하는 경우 옵션을 추가 -F하면 grep검색 속도가 엄청나게 빨라집니다(참조:원천)

  2. 실제로 단어를 찾고 있다는 것을 알고 있는 경우, 즉 검색 패턴이 단어가 아닌 문자나 줄의 시작/끝으로 제한되는 경우 이 -w옵션을 추가하세요. 검색 속도가 빨라질 것 같아요.

관련 정보