我试图从十几个文件.tar.gz grep模式,但它非常慢
我正在使用
tar -ztf file.tar.gz | while read FILENAME
do
if tar -zxf file.tar.gz "$FILENAME" -O | grep "string" > /dev/null
then
echo "$FILENAME contains string"
fi
done
Run Code Online (Sandbox Code Playgroud)
lan*_*nes 107
如果你有,zgrep你可以使用
zgrep -a string file.tar.gz
Run Code Online (Sandbox Code Playgroud)
Jes*_*ter 31
您可以使用该--to-command选项将文件传输到任意脚本.使用此功能,您可以一次性处理存档(并且没有临时文件).另请参阅此问题和手册.有了上述信息,您可以尝试以下方法:
$ tar xf file.tar.gz --to-command "awk '/bar/ { print ENVIRON[\"TAR_FILENAME\"]; exit }'"
bfe2/.bferc
bfe2/CHANGELOG
bfe2/README.bferc
Run Code Online (Sandbox Code Playgroud)
我知道这个问题已经4岁了,但是我有两种选择:
tar --to-command grep下面的行应该在example.tgz的PATTERN。这类似于@Jester的示例,但是我无法使他的模式匹配起作用。
tar xzf example.tgz --to-command 'grep --label="$TAR_FILENAME" -H PATTERN ; true'
Run Code Online (Sandbox Code Playgroud)
tar -tzf第二个选项是tar -tzf用于列出文件,然后使用进行浏览grep。您可以创建一个函数来反复使用它:
targrep () {
for i in $(tar -tzf "$1"); do
results=$(tar -Oxzf "$1" "$i" | grep --label="$i" -H "$2")
echo "$results"
done
}
Run Code Online (Sandbox Code Playgroud)
用法:
targrep example.tar.gz "pattern"
Run Code Online (Sandbox Code Playgroud)
以下两个选项都运行良好。
$ zgrep -ai 'CDF_FEED' FeedService.log.1.05-31-2019-150003.tar.gz | more
2019-05-30 19:20:14.568 ERROR 281 --- [http-nio-8007-exec-360] DrupalFeedService : CDF_FEED_SERVICE::CLASSIFICATION_ERROR:408: Classification failed even after maximum retries for url : abcd.html
$ zcat FeedService.log.1.05-31-2019-150003.tar.gz | grep -ai 'CDF_FEED'
2019-05-30 19:20:14.568 ERROR 281 --- [http-nio-8007-exec-360] DrupalFeedService : CDF_FEED_SERVICE::CLASSIFICATION_ERROR:408: Classification failed even after maximum retries for url : abcd.html
Run Code Online (Sandbox Code Playgroud)
对于初学者来说,您可以启动多个进程:
tar -ztf file.tar.gz | while read FILENAME
do
(if tar -zxf file.tar.gz "$FILENAME" -O | grep -l "string"
then
echo "$FILENAME contains string"
fi) &
done
Run Code Online (Sandbox Code Playgroud)
创建( ... ) &一个新的分离(读:父 shell 不等待子)进程。
之后,您应该优化存档的提取。读取没有问题,因为操作系统应该已经缓存了文件访问。但是,tar 需要在每次循环运行时解压存档,这可能会很慢。解压存档一次并迭代结果可能会有所帮助:
local tempPath=`tempfile`
mkdir $tempPath && tar -zxf file.tar.gz -C $tempPath &&
find $tempPath -type f | while read FILENAME
do
(if grep -l "string" "$FILENAME"
then
echo "$FILENAME contains string"
fi) &
done && rm -r $tempPath
Run Code Online (Sandbox Code Playgroud)
find此处使用,获取 的目标目录中的文件列表tar(我们正在迭代该目录),其中每个文件都搜索字符串。
编辑:grep -l正如吉姆指出的那样,用于加快速度。从man grep:
-l, --files-with-matches
Suppress normal output; instead print the name of each input file from which output would
normally have been printed. The scanning will stop on the first match. (-l is specified
by POSIX.)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87630 次 |
| 最近记录: |