Se você precisar usar padrões de arquivo mais expressivos no estilo grep
:
tar -OT <(tar -tf /path/to/file.tar | grep 'FILE_PATTERN') -xf /path/to/file.tar \
| grep 'CONTENT_PATTERN'
-O
especifica a saída como stdout
e -T
especifica um arquivo contendo nomes a serem extraídos, quando usado em conjunto com -x
.
Se uma expansão do nome do caminho mais simples for boa o suficiente, você pode substituir a substituição do processo ( <( ... )
) com uma linha echo
mais simples, isso evita ter que executar tar
no arquivo duas vezes:
tar -OT <(echo 'FILE_PATTERN') -xf /path/to/file.tar \
| grep 'CONTENT_PATTERN'
Se você também quiser ver os nomes dos arquivos, adicione a -v
flag (pessoalmente, eu irei para -xvf
), mas você também precisará modificar CONTENT_PATTERN
para grep para os nomes dos arquivos novamente. Vou deixar isso como um exercício para o leitor ...
É um pouco complicado, e você provavelmente terá que usar awk
para um pouco mais de processamento de saída ... Os nomes dos arquivos correspondentes serão exibidos por linha, então infelizmente não há um delimitador bem definido aqui. Presumindo que nomes de arquivos não serão repetidos como conteúdo :
tar ... | awk '/^FILLE_AWK_PATTERN$/{f=$0;next}...'
Isso define o awk
variable f
para cada novo nome de arquivo encontrado e pula para a próxima linha . Então,
tar ... | awk '...$f&&/CONTENT_AWK_PATTERN/{print $f;$f=""}'
Quando virmos uma linha correspondente, imprimiremos $f
e redefiniremos nosso nome de arquivo até que o próximo arquivo seja 'encontrado'.
Colocando tudo junto:
tar -OT <(echo 'FILE_PATTERN') -xf /path/to/file.tar \
| awk '/^FILLE_AWK_PATTERN$/{f=$0;next};$f&&/CONTENT_AWK_PATTERN/{print $f;$f=""}'