Bash의 임의 바이트 수 오프셋에서 시작하는 파일을 읽을 수 있습니까?

Bash의 임의 바이트 수 오프셋에서 시작하는 파일을 읽을 수 있습니까?

8GB 로그(텍스트) 어딘가에서 날짜를 찾고 싶습니다.

어떻게든 전체 순차 읽기를 우회하고 먼저 파일(크기)의 이진 분할을 수행하거나 어떻게든 파일 시스템을 탐색할 수 inodes있습니다.매우소수), 적절한 오프셋을 찾을 때까지 각 분할 지점에서 읽기를 시작합니다. 날짜가 포함된 줄에 대한 텍스트 검색을 어디에서 시작합니까?

tail마지막 줄 읽기는 일반적인 순차 읽기를 사용하지 않아서 이 도구를 bash에서 사용할 수 있는지, 아니면 Python이나 C/C++를 사용해야 하는지 궁금합니다... 그런데 bash특히 한 가지 옵션에 관심이 갑니다. .

답변1

당신이 원하는 것 같습니다 :

tail -c +1048576

또는 건너뛰려는 바이트 수. 더하기 기호는 tail이 파일 끝이 아닌 시작 부분부터 측정을 시작하도록 지시합니다. GNU 버전의 tail을 사용하는 경우 다음과 같이 작성할 수 있습니다.

tail -c +1M

파일의 나머지 부분을 모두 잘라내는 대신 고정된 바이트 수를 얻으려면 헤드를 통해 파이프하면 됩니다.

tail -c +1048576 | head -c 1024

답변2

for (( block = 0; block < 16; block += 1 ))
do 
    echo $block; 
    dd if=INPUTFILE skip=$((block*512))MB bs=64 count=1 status=noxfer 2> /dev/null | \
        head -n 1
done

where..는 임시 분할 파일을 생성하지 않고 실행될 때마다 *512MB의 데이터 청크를 건너뛰고 해당 위치에서 64바이트를 읽고 출력을 해당 64바이트의 첫 번째 줄로 제한합니다.

64를 필요하다고 생각하는 것으로 조정해야 할 수도 있습니다.

답변3

더 빠른 구문 분석을 위해 로그를 512MiB 청크로 분할하는 것과 비슷한 것을 시도할 것입니다.

split <filename> -b 536870912

파일을 찾고 있다면 다음과 같이 작동합니다.

for file in x* ; do
  echo $file
  head -n 1 $file
done

이 출력을 사용하여 날짜를 찾기 위해 검색할 파일을 결정합니다.

답변4

여기 내 스크립트가 있습니다. 첫 번째 필드가 내 번호와 일치하는 첫 번째 행을 찾고 있습니다. 행은 첫 번째 필드를 기준으로 정렬됩니다. 나는 dd를 사용하여 128K 블록의 첫 번째 라인을 확인한 다음 해당 블록으로 점프하여 검색을 수행합니다. 파일이 1M를 초과할 때 효율성이 향상됩니다.

의견이나 수정 사항을 알려주시면 감사하겠습니다!

#!/bin/bash

search=$1;
f=$2;

bs=128;

max=$( echo $(du $f | cut -f1)" / $bs" | bc );
block=$max;
for i in $(seq 0 $max); do
 n=$(dd bs=${bs}K skip=$i if=$f 2> /dev/null| head -2 | tail -1 | cut -f1)
 if [ $n -gt $search ]; then
  block=`expr $i - 1` 
  break;
 fi
done; 
dd bs=${bs}K skip=$block if=$f 2> /dev/null| tail -n +2 | awk -v search="$search" '$1==search{print;exit 1;};$1>search{exit 1;};';

*편집하다*** grep이 더 빠르고 확인하다아니면 더 나은

관련 정보