[英]How to grep for a pattern in the files in tar archive without filling up disk space
我有一个tar存档,非常大~5GB。
我想在存档中grep查看所有文件上的模式(并且还打印具有该模式的文件的名称),但不想通过提取存档来填满我的磁盘空间。
无论如何我能做到吗?
我尝试了这些,但这并没有给我包含模式的文件名,只是匹配的行:
tar -O -xf test.tar.gz | grep 'this'
tar -xf test.tar.gz --to-command='grep awesome'
此外,tar的这个特性记录在哪里? tar xf test.tar $ FILE
似乎没人发布这个只处理存档一次的简单解决方案:
tar xzf archive.tgz --to-command \
'grep --label="$TAR_FILENAME" -H PATTERN ; true'
这里tar
传递变量中每个文件的名称(参见文档 ), grep
使用它来打印每个匹配项。 同样添加了true
,以便tar
不会抱怨无法提取不匹配的文件。
这是我对此的看法:
while read filename; do tar -xOf file.tar "$filename" | grep 'pattern' | sed "s|^|$filename:|"; done < <(tar -tf file.tar | grep -v '/$')
分解为:
while read filename; do
while read filename; do
- 这是一个循环...... tar -xOf file.tar "$filename"
- 这会提取每个文件...... | grep 'pattern'
| grep 'pattern'
- 这里是你放置模式的地方...... | sed "s|^|$filename:|";
- 前置文件名,所以这看起来像grep。 盐味。 done < <(tar -tf file.tar | grep -v '/$')
- 结束循环,获取文件列表,以便while read
感到厌烦。 一个附带条件:如果您的文件名中有OR条( |
),则会中断。
嗯。 实际上,这是一个很好的小bash函数,你可以将它附加到你的.bashrc
文件:
targrep() {
local taropt=""
if [[ ! -f "$2" ]]; then
echo "Usage: targrep pattern file ..."
fi
while [[ -n "$2" ]]; do
if [[ ! -f "$2" ]]; then
echo "targrep: $2: No such file" >&2
fi
case "$2" in
*.tar.gz) taropt="-z" ;;
*) taropt="" ;;
esac
while read filename; do
tar $taropt -xOf "$2" \
| grep "$1" \
| sed "s|^|$filename:|";
done < <(tar $taropt -tf $2 | grep -v '/$')
shift
done
}
这是一个可能适合你的bash函数。 将以下内容添加到~/.bashrc
targrep () {
for i in $(tar -tzf "$1"); do
results=$(tar -Oxzf "$1" "$i" | grep --label="$i" -H "$2")
echo "$results"
done
}
用法:
targrep archive.tar.gz "pattern"
这是非常hacky,但你可以滥用tar的-v
选项来处理和删除每个文件,因为它被提取。
grep_and_delete() {
if [ -n "$1" -a -f "$1" ]; then
grep -H 'this' -- "$1" </dev/null
rm -f -- "$1" </dev/null
fi
}
mkdir tmp; cd tmp
tar -xvzf test.tar.gz | (
prev=''
while read pathname; do
grep_and_delete "$prev"
prev="$pathname"
done
grep_and_delete "$prev"
)
tar -tf test.tar.gz | grep -v '/$'| \
xargs -n 1 -I _ \
sh -c 'tar -xOf test.tar.gz _|grep -q <YOUR SEARCH PATTERN> && echo _'
尝试:
tar tvf name_of_file |grep --regex="pattern"
t选项将测试tar文件而不解压缩文件。 v很冗长,f打印出文件名。 这应该可以节省相当多的硬盘空间。
可能有帮助
zcat log.tar.gz | grep -a -i "string"
zgrep -i "string" log.tar.gz
http://www.commandlinefu.com/commands/view/9261/grep-compressed-log-files-without-extracting
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.