linux – 如何在tar存档中的文件中grep for pattern而不填满磁盘空间

我有一个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

解决方法

这是我对此的看法:
while read filename; do tar -xOf file.tar "$filename" | grep 'pattern' | sed "s|^|$filename:|"; done < <(tar -tf file.tar | grep -v '/$')

分解为:

>读取文件名;做 – 这是一个循环……
> tar -xOf file.tar“$filename” – 这会提取每个文件……
> | grep’pattern’ – 这里是你放置模式的地方……
> | sed“s | ^ | $filename:|”; – 前置文件名,所以这看起来像grep.盐味.
>完成< <(tar -tf file.tar | grep -v'/ $') - 结束循环,获取文件列表,以便在阅读时对你有所帮助.
一个附带条件:如果您的文件名中有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
}

相关文章

在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异...
git使用小结很多人可能和我一样,起初对git是一无所知的。我...
1. 操作系统环境、安装包准备 宿主机:Max OSX 10.10.5 虚拟...
因为业务系统需求,需要对web服务作nginx代理,在不断的尝试...
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核...
一、Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个...