gho*_*g74 38
该tar命令有一个-O开关,用于将文件解压缩到标准输出.所以你可以输出那些输出grep/awk
tar xvf test.tar -O | awk '/pattern/{print}'
tar xvf test.tar -O | grep "pattern"
Run Code Online (Sandbox Code Playgroud)
例如,返回一个找到的模式的文件名
tar tf myarchive.tar | while read -r FILE
do
if tar xf test.tar $FILE -O | grep "pattern" ;then
echo "found pattern in : $FILE"
fi
done
Run Code Online (Sandbox Code Playgroud)
Rob*_*uil 26
该命令zgrep应该直接完成您想要的操作.
例如
zgrep "mypattern" *.gz
Run Code Online (Sandbox Code Playgroud)
http://linux.about.com/library/cmd/blcmdl1_zgrep.htm
GNU tar有--to-command.有了它,您可以tar将存档中的每个文件传输到给定的命令中.对于您只想要匹配的行的情况,该命令可以很简单grep.要知道文件名,您需要利用tar在命令环境中设置某些变量; 例如,
tar xaf thing.tar.xz --to-command="awk -e '/thing.to.match/ {print ENVIRON[\"TAR_FILENAME\"] \":\", \$0}'"
Run Code Online (Sandbox Code Playgroud)
因为我发现自己经常使用这个,我有这个:
#!/bin/sh
set -eu
if [ $# -lt 2 ]; then
echo "Usage: $(basename "$0") <pattern> <tarfile>"
exit 1
fi
if [ -t 1 ]; then
h="$(tput setf 4)"
m="$(tput setf 5)"
f="$(tput sgr0)"
else
h=""
m=""
f=""
fi
tar xaf "$2" --to-command="awk -e '/$1/{gsub(\"$1\", \"$m&$f\"); print \"$h\" ENVIRON[\"TAR_FILENAME\"] \"$f:\", \$0}'"
Run Code Online (Sandbox Code Playgroud)
tar --to-command这可以通过和 来完成grep --label:
tar xaf archive.tar.gz --to-command 'egrep -Hn --label="$TAR_FILENAME" your_pattern_here || true'
Run Code Online (Sandbox Code Playgroud)
--label给 grep 文件名-H告诉 grep 显示文件名和-n行号|| true否则,如果未找到模式,grep 将退出并显示错误,并tar会抱怨这一点。xaf意味着根据文件扩展名提取并自动解压缩--to-commandtar 将 tarfile 中的每个文件传递给 grep 的单独调用,并使用有关该文件的信息设置各种环境变量。请参阅联机帮助页以获取更多信息。很大程度上基于Chipaca 的答案(以及 Daniel H 的评论),但这应该更容易使用,只需使用 tar 和 grep。