Искать в большом файле tar.gz ключевые слова, копировать и удалять

1

Каков наилучший способ с большими файлами log tar.gz, некоторые из них - 20 гигабайт, чтобы открыть и найти ключевое слово, скопировать найденные файлы в каталог, а затем удалить файл, чтобы он не занимал дисковое пространство. У меня есть код ниже, он работает, но потом по какой-то причине он прекратил извлечение файлов. Если я удалю параметр -O из tar, он снова извлечет файлы.

mkdir -p found;
tar tf "$1" | while read -r FILE
do
    if tar xf "$1" "$FILE" -O  | grep -l "$2" ;then
        echo "found pattern in : $FILE";
        cp $FILE found/$(basename $FILE);
        rm -f $FILE;
    fi
done

$ 1 - файл tar.gz, $ 2 - ключевое слово

ОБНОВИТЬ

Я делаю ниже, что работает, но у небольшого файла у меня есть 2 миллиона плюс сжатые файлы, поэтому потребуется несколько часов, чтобы посмотреть на все файлы. Есть ли решение python или подобное, что может сделать это быстрее.

#!/bin/sh
# tarmatch.sh
if grep -l "$1" ; then 
  echo  "Found keyword in ${TAR_FILENAME}";
  tar -zxvf "$2" "${TAR_FILENAME}" 
else
  echo "Not found in ${TAR_FILENAME}";
fi
true

tar -zxf 20130619.tar.gz --to-command "./tarmatch.sh '@gmail' 20130619.tar.gz "

ОБНОВЛЕНИЕ 2

Я использую python сейчас и, кажется, увеличился в скорости, делал около 4000 записей в секунду, в то время как версия bash делала примерно 5. Я не настолько силен в python, поэтому, вероятно, этот код можно было бы оптимизировать, сообщите мне, может ли это быть оптимизировано.

import tarfile
import time
import os
import ntpath, sys

if len(sys.argv) < 3 :
  print "Please provide the tar.gz file and keyword to search on"
  print "USAGE: tarfind.py example.tar.gz keyword"
  sys.exit() 

t = tarfile.open(sys.argv[1], 'r:gz')
cnt = 0;
foundCnt = 0;
now = time.time()
directory = 'found/'
if not os.path.exists(directory):
    os.makedirs(directory)

for tar_info in t:
    cnt+=1;
    if (tar_info.isdir()): continue
    if(cnt%1000 == 0): print "Processed " + str(cnt) + " files"
    f=t.extractfile(tar_info)
    if sys.argv[2] in f.read():
      foundCnt +=1
      newFile = open(directory + ntpath.basename(tar_info.name), 'w');
      f.seek(0,0)
      newFile.write( f.read() )
      newFile.close()
      print "found in file " + tar_info.name

future = time.time()
timeTaken = future-now

print "Found " + str(foundCnt) + " records"
print "Time taken " + str( int( timeTaken/60) ) + " mins " + str(int(timeTaken%60)) + " seconds"
print  str( int(cnt / timeTaken)) + " records per second"
t.close()
Теги:
grep
tar

2 ответа

1
Лучший ответ

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

Лучший совет, который я могу дать, вероятно, использует мощную комбинацию инструмента поиска инвертированного индекса, такого как Solr (на основе Lucene Indes) и Apache Tika - инструментарий анализа контента.

Используя эти инструменты, вы можете индексировать файлы tar.gz и при поиске ключевого слова соответствующие документы, содержащие ключевое слово, будут возвращены.

  • 0
    Когда я запускаю первую строку, она возвращает -bash: -ztvf: command not found
  • 0
    Ааа! Теперь проверьте, что вам нужно сделать что-то вроде $ (any_commond) для запуска этого из терминала bash или, может быть, вы можете поместить команды в скрипт.
Показать ещё 9 комментариев
1

Если файл действительно 20 ГБ, это займет очень много времени для grep в любом случае. Единственный совет, который я могу дать, - использовать zgrep. Это избавит вас от необходимости явно разжать архив.

zgrep PATTERN your.tgz
  • 0
    Как бы я использовал это, чтобы скопировать найденные файлы в другой каталог?
  • 0
    Должен признать, что я не внимательно прочитал ваш вопрос. Чтобы скопировать файлы в каталог, вам придется распаковать их. Я никогда этого не делал, но я ожидаю, что можно распаковать всего пару файлов из архива, используя tar . zgrep выдаст вам имена файлов (внутри архива)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню