오프셋에서 파일 처리를 시작하는 방법은 무엇입니까?

오프셋에서 파일 처리를 시작하는 방법은 무엇입니까?

사용 사례: 일주일 전체에 대한 수 GB의 로그 파일이 있고 예를 들어 토요일에 발생한 일을 검색해야 합니다 grep. 경험에 근거하여 추측하면 파일 중간에서 검색을 시작하면 관련 데이터를 건너뛰지 않으면서도 처리 시간이 절반 이상 단축될 것이라고 가정합니다(파일의 나머지 부분 전체를 처리할 필요가 없기 때문에). 이것이 가능한가?

답변1

데이터가 시간순으로 정렬되어 있다고 가정합니다.

  1. 끝까지 찾아 다음을 수행하여 파일 크기를 가져옵니다 ftell().
  2. 그 결과를 2로 나눕니다.
  3. fseek()해당 위치를 찾는 데 사용합니다 .
  4. 한 번 호출하여 다음 줄의 시작 부분을 찾습니다 getline().
  5. strptime()현재 날짜를 확인하는 데 사용합니다 .
  6. 원하는 줄을 찾을 때까지 4단계와 5단계를 반복하여 이진 검색을 수행합니다.

답변2

dd다음과 같이 사용할 수 있습니다 .

dd if=log skip=xK bs=1M

x * 1024 크기의 1M(2^20) 블록을 건너뜁니다. dd(1)장치 취급에 대한 자세한 내용은 을 참조하십시오 .

이진 검색을 자동화하려면 로그에 <date> [data]출력을 파이프할 수 있는 일반적인 형식이 있다고 가정하고 head -n 2시작 부분의 날짜를 확인하세요.두번째줄("일반적으로" 긴 줄이라는 합리적인 가정 하에 줄이 완성될 것임)을 선택하고 원하는 절반을 결정합니다.

답변3

파일 크기를 구하고 2로 나눕니다. KiB를 얻으려면 1024로 나눕니다. (또는 MiB 등을 얻으려면 1024*1024)

((fs = $(stat -c %s logfile) / 2 / 1024))

건너뛰고 검색하기

dd if=logfile bs=1024 skip=$fs | grep blahblah

로그 파일이 다음과 같은 경우 이에 대해 더 확장할 수 있습니다.매우데이터 양과 일치합니다. 일 count=에 값을 추가하여 dd.

((cnt = $(stat -c %s logfile) / 5 / 1024))

dd if=logfile bs=1024 skip=$fs count=$cnt | grep blahblah

그러면 cnt * 1024오프셋 바이트에서 데이터 바이트가 파이프됩니다 fs * 1024.

모든 것을 스크립트로 마무리하고 스크립트 외부에서 grep, 임시 파일 또는 원하는 대로 파이핑을 수행합니다.

답변4

당신이 정확히 무엇을 하고 싶은지, 내 "프로세스"가 무엇을 의미하는지 명확하지 않습니다. 큰 파일의 경우 내가 가장 좋아하는 대화형 프로그램은 less. 대용량 파일을 문제없이 처리합니다. 또한 를 사용하여 특정 비율로 건너뛸 수도 있습니다 30%. 또한 /및 를 사용하여 검색할 수도 있습니다 ?.

관련 정보