Контекст
Допустим, у меня есть два файла a.txt
и b.txt
с некоторым содержанием ...
$ tail *.txt
==> a.txt <==
ABC
CDE
123
C
==> b.txt <==
C
321
EDC
CBA
Давайте также представим, что файлы теперь помещены вархив gzipped ...
$ tar -czf tarball.tgz *.txt
$ tar -tf tarball.tgz
a.txt
b.txt
Цель
Теперь я хочу просмотреть файлы в архиве. Было бы неплохо увидеть исходное имя файла и номер строки перед совпадением, но мне важнее всего увидеть совпадающие строки.
Что я пробовал?
Сначала я ожидал, чтоzgrep 'pattern' tarball.tgz
будет просто работать. Он говорит мне, есть ли совпадение, он может даже подсчитать их, но я не могу найти способ напечатать совпадения ...
$ zgrep 'AB' tarball.tgz
Binary file (standard input) matches
$ zgrep 'C' tarball.tgz
Binary file (standard input) matches
$ zgrep -c 'AB' tarball.tgz
1
$ zgrep -c 'C' tarball.tgz
6
Во-вторых, я подумал, что zcat
tarball и используйте обычный grep для этого. Но тем не менее, я получаю точно такое же «Двоичный файл (стандартный ввод) соответствует» сообщение ...
$ zcat tarball.tgz | grep 'C'
Binary file (standard input) matches
Я думаю, zcat
(и zgrep
) сделать gunzip
а нет tar -xf
? Если я смотрю на zcat
, я вижу тот же вывод, как если бы я только что сделал tar -c
...
$ zcat tarball.tgz
a.txt0000664�3���3���0000000001613554050266013370 0ustar useruserABC
CDE
123
C
b.txt0000664�3���3���0000000001613554050301013357 0ustar useruserC
321
EDC
CBA
$ tar -c *.txt
a.txt0000664�3���3���0000000001613554050266013370 0ustar useruserABC
CDE
123
C
b.txt0000664�3���3���0000000001613554050301013357 0ustar useruserC
321
EDC
CBA
Итак, наконец, я получил это решение, которое работает нормально:
$ tar -xOzf tarball.tgz | grep 'C'
ABC
CDE
C
C
EDC
CBA
Конечно, если я сейчас спрошу об именах файлов и номерах строк, я не получу ничего полезного ...
$ tar -xOzf tarball.tgz | grep -Hn 'C'
(standard input):1:ABC
(standard input):2:CDE
(standard input):4:C
(standard input):5:C
(standard input):7:EDC
(standard input):8:CBA
Единственный способ, которым я могу придумать, получить результатыЯ хочу, потребовалось бы немного больше сценариев для извлечения архива и запуска grep
в цикле ...
Есть ли хороший (простой и лаконичный) способ сделать это?