Возможно ли в bash начать чтение файла из смещения счетчика байтов?

Я хочу найти дату, которая находится где-то в журнале объемом 8 ГБ (текст).

Могу ли я несколько обойти полное последовательное чтение и сначала сделать двоичные расщепления файла (размера) или каким-то образом перейти к файловой системе inodes (о котором я немного знаю very ), чтобы начать чтение из каждой точки разделения, пока не найду подходящее смещение от того, где начать мой текстовый поиск строки, содержащей дату?

tail в последней строке не используется обычное последовательное чтение, поэтому я задаюсь вопросом, доступно ли это средство в bash, или мне нужно будет использовать Python или C /C ++ ... но меня особенно интересует опция bash ..

16 голосов | спросил Peter.O 2 MaramWed, 02 Mar 2011 07:45:00 +03002011-03-02T07:45:00+03:0007 2011, 07:45:00

3 ответа


8
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

, который не создает файлы с временным разделением, пропускает блоки * 512 Мбайт данных при каждом запуске, считывает 64 байта из этой позиции и ограничивает вывод в первую строку из этих 64 байтов.

вы можете настроить 64 на все, что вам кажется.

ответил akira 2 MaramWed, 02 Mar 2011 09:10:48 +03002011-03-02T09:10:48+03:0009 2011, 09:10:48
23

Похоже, вы хотите:

tail -c +1048576

или любое количество байтов, которое вы хотите пропустить. Знак плюса говорит хвосту для измерения от начала файла, а не до конца. Если вы используете версию хвоста GNU, вы можете записать это как:

tail -c +1M

Чтобы получить фиксированное количество байтов после разреза, вместо всего остального файла просто пропустите его через голову:

tail -c +1048576 | head -c 1024
ответил Ross Smith 3 MaramThu, 03 Mar 2011 00:21:23 +03002011-03-03T00:21:23+03:0012 2011, 00:21:23
0

Вот мой сценарий, я ищу первую строку, первое поле соответствует моему числу. Строки сортируются в соответствии с первым полем. Я использую 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;};';

* EDIT * ** grep намного быстрее и ack даже лучше

ответил user59892 8 FebruaryEurope/MoscowbSat, 08 Feb 2014 05:55:54 +0400000000amSat, 08 Feb 2014 05:55:54 +040014 2014, 05:55:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132