1

大型日志 tar.gz 文件的最佳方法是什么,有些是 20 gig,打开并搜索关键字,将找到的文件复制到目录,然后删除文件,这样它就不会占用磁盘空间。我在下面有一些代码,它正在工作,但由于某种原因它突然停止提取文件。如果我从 tar 中删除 -O 选项,它会再次提取文件。

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 是关键字

更新

我正在做下面的工作,但是我有一个小文件有 200 万个压缩文件,所以需要几个小时才能查看所有文件。是否有 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()
4

2 回答 2

1

如果文件真的是 20GB,那么无论如何 grep 都需要很长时间。我能给出的唯一建议是使用zgrep. 这将使您不必显式解压缩存档。

zgrep PATTERN your.tgz
于 2013-07-29T10:44:26.973 回答
1

如果您尝试在文件中搜索关键字并仅提取这些关键字,并且由于您的文件很大,那么如果关键字位于中间位置可能需要一些时间。

我能给出的最佳建议可能是使用强大的倒排索引查找工具组合,例如Solr(基于 Lucene Indes)和Apache Tika - 一个内容分析工具包。

使用这些工具,您可以索引 tar.gz 文件,当您搜索关键字时,将返回包含该关键字的相关文档。

于 2013-07-29T10:54:24.593 回答