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이 더 빠르고 확인하다아니면 더 나은