2015-04-17 2 views
0

Я хотел бы знать, как отобразить имя файла вместе с строками, соответствующими определенному слову tar-файла.Показать имя файла tar файла

Команда мудр:

zcat file | grep "stuff" -r # shows what I want 
zcat *.gz | grep "stuff" -ar # this fails 
+0

Добро пожаловать в СЦ! Пожалуйста, подумайте о форматировании кода с помощью кнопки '{}' для повышения удобочитаемости. –

+1

проверить http://stackoverflow.com/questions/13983365/grep-from-tar-gz-without-extracting-faster-one –

+0

Эта кнопка находится в редакторе, не набирайте '{' и '}': -) Вы можете просто поставить 4 пробела перед каждой строкой поочередно. –

ответ

0

Вы можете использовать zgrep:

Для одного файла, вы можете использовать следующую команду, чтобы отобразить имя файла:

zgrep "stuff" file.gz /dev/null 

Для нескольких файлов:

+0

Похоже, что OP имеет tgz. в то время как 'zgrep' делает хорошую работу grepping внутри gzipped-файлов, я не думаю, что это будет хорошо работать для grepping в файлах в gzipped tarball _and_ напечатать их имя. –

+0

Его пример показывает '* .gz' – Amit

+0

Да, я знаю, но OP также написал« tar-файл ». Возможно, я ошибаюсь, и они имели в виду «gz-файл». –

0

Я не совсем уверен, в чем вопрос, но если вы ищете файлы tar в своей системе, тогда просто сделайте что-нибудь подобное. Это будет рекурсивно искать ваш текущий каталог и любые дочерние каталоги для файлов .tar. Надеюсь это поможет.

find -name "*.tar" 
+0

Нет, это не будет - вы имели в виду «найти»? OP не хочет искать tar-файлы, но grep для выражения внутри файлов _in-tar-файл. –

+0

oops, yes Я сделал Я имел в виду: find -name "* .tar" – blakepeterman

+0

Теперь это утверждение верно, спасибо за редактирование. Я просто боюсь, что ваш пост все еще не отвечает на вопрос :-) –

0

Возможно, это может помочь related answer. Он использует tar для разворачивания (вам нужно будет добавить -z) и прокладывает каждый файл архива в awk для «grepping» внутри него.

0

Если zcat file | grep "stuff" -r показывает, что вы хотите, вы можете сделать это для нескольких файлов:

for name in *.gz ; do zcat "$name" | grep -a "stuff" | sed -e "s/^/${name}: /" ; done 

Эта команда использует подстановку (*), чтобы развернуть в список .gz файлов в рабочем каталоге, а затем вызывает zcat для извлечение, grep для поиска и sed для префикса с именем файла для каждого из файлов.

Обратите внимание, что если вы работаете с gzipped tarballs, большинство людей дарят им .tgz или .tar.gz вместо .gz.

0

Это будет выводить имяOfFileInTar: LineNumber: Match. Вызов с greptar.sh tarfile.tar pattern

Если вы не хотите номер строки, удалите опцию -n. Если вы хотите, только номер строки, добавьте |cut -f1 -d: после grep

#!/bin/bash 

TARFILE=$1 
PATTERN=$2 
tar ztf $TARFILE | while read -r FILE 
do 
    res=$(tar zxf $TARFILE $FILE -O | grep -n $2) 
    if [[ $? == 0 ]]; then 
     echo "$res" | while read -r line; do 
     echo $FILE:$line; 
     done 
    fi 
done 
Смежные вопросы