我有一个tar归档,这是非常大〜5GB。
我希望到grep对所有文件的模式(也打印有图案的文件名),在存档,但不希望通过提取存档,以填补我的磁盘空间。
无论如何,我能做到吗?
我尝试了这些,但是这并没有给我包含模式,只匹配行的文件名:
tar -O -xf test.tar.gz | grep 'this'
tar -xf test.tar.gz --to-command='grep awesome'
另外其中焦油此功能记录? 焦油XF test.tar $ FILE
我有一个tar归档,这是非常大〜5GB。
我希望到grep对所有文件的模式(也打印有图案的文件名),在存档,但不希望通过提取存档,以填补我的磁盘空间。
无论如何,我能做到吗?
我尝试了这些,但是这并没有给我包含模式,只匹配行的文件名:
tar -O -xf test.tar.gz | grep 'this'
tar -xf test.tar.gz --to-command='grep awesome'
另外其中焦油此功能记录? 焦油XF test.tar $ FILE
这里是我拿到这个:
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 '/$')
-结束循环,得到的文件列表作为FEAD您while read
。 其中一个条件:这打破,如果你有或棒材( |
在你的文件名)。
嗯。 事实上,这使得一个不错的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
}
好像没有人发表在这个简单的解决方案, 处理存档只有一次:
tar xzf archive.tgz --to-command \
'grep --label="$TAR_FILENAME" -H PATTERN ; true'
这里tar
通过在一个可变(参照各文件的文件名的文档 ),它是用来通过grep
与每个匹配打印。 也true
加入使tar
不抱怨未能提取不匹配的文件。
下面是一个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"
这是令人难以置信的哈克,但你可能滥用焦油的-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