Я хотел бы знать, как отобразить имя файла вместе с строками, соответствующими определенному слову tar-файла.Показать имя файла tar файла
Команда мудр:
zcat file | grep "stuff" -r # shows what I want
zcat *.gz | grep "stuff" -ar # this fails
Я хотел бы знать, как отобразить имя файла вместе с строками, соответствующими определенному слову tar-файла.Показать имя файла tar файла
Команда мудр:
zcat file | grep "stuff" -r # shows what I want
zcat *.gz | grep "stuff" -ar # this fails
Вы можете использовать zgrep
:
Для одного файла, вы можете использовать следующую команду, чтобы отобразить имя файла:
zgrep "stuff" file.gz /dev/null
Для нескольких файлов:
Похоже, что OP имеет tgz. в то время как 'zgrep' делает хорошую работу grepping внутри gzipped-файлов, я не думаю, что это будет хорошо работать для grepping в файлах в gzipped tarball _and_ напечатать их имя. –
Его пример показывает '* .gz' – Amit
Да, я знаю, но OP также написал« tar-файл ». Возможно, я ошибаюсь, и они имели в виду «gz-файл». –
Я не совсем уверен, в чем вопрос, но если вы ищете файлы tar в своей системе, тогда просто сделайте что-нибудь подобное. Это будет рекурсивно искать ваш текущий каталог и любые дочерние каталоги для файлов .tar. Надеюсь это поможет.
find -name "*.tar"
Нет, это не будет - вы имели в виду «найти»? OP не хочет искать tar-файлы, но grep для выражения внутри файлов _in-tar-файл. –
oops, yes Я сделал Я имел в виду: find -name "* .tar" – blakepeterman
Теперь это утверждение верно, спасибо за редактирование. Я просто боюсь, что ваш пост все еще не отвечает на вопрос :-) –
Возможно, это может помочь related answer. Он использует tar
для разворачивания (вам нужно будет добавить -z
) и прокладывает каждый файл архива в awk
для «grepping» внутри него.
Если 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
.
Это будет выводить имя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
Добро пожаловать в СЦ! Пожалуйста, подумайте о форматировании кода с помощью кнопки '{}' для повышения удобочитаемости. –
проверить http://stackoverflow.com/questions/13983365/grep-from-tar-gz-without-extracting-faster-one –
Эта кнопка находится в редакторе, не набирайте '{' и '}': -) Вы можете просто поставить 4 пробела перед каждой строкой поочередно. –