Bashの任意のバイト数オフセットから始まるファイルを読み取ることはできますか?

Bashの任意のバイト数オフセットから始まるファイルを読み取ることはできますか?

8GBログ(テキスト)どこかで日付を見つけたいです。

何らかの方法で完全な順次読み取りをバイパスし、最初にファイル(サイズ)のバイナリ分割を実行するか、何らかの方法でファイルシステムをナビゲートすることができますinodes非常に素数)、適切なオフセットが見つかるまで、各分割点で読み取りを開始します。日付を含む行のテキスト検索をどこで開始しますか?

tail最後の行の読み取りは、通常の順次読み取りを使用せずにこのツールをbashで使用できるのか、PythonやC / C ++を使用する必要があるのか​​疑問に思います...しかし、bash特に1つのオプションに興味があります。 。

答え1

あなたが望むようです:

tail -c +1048576

またはスキップするバイト数。プラス記号は、テールにファイルの終わりではなく開始から測定を開始するよう指示します。 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が速い 確認するまたはより良い

関連情報