У меня есть тысячи файлов 7z с именами data1.7z, data2.7z и так далее. Содержимое каждого файла — data1.log, data2.log и т. д. Я могу перечислить содержимое, используя
7z l *.7z.
Я хотел бы сделать это grep или найти шаблон внутри файлов .log без необходимости извлечения всего.
Эти файлы содержат IP-адреса и надеются найти набор IP-адресов из другого файла с именем ipaddress.txt в каждом файле .log и распечатать строки, соответствующие любому IP-адресу из файла .txt.
Заранее спасибо.





Это невозможно. Вы не можете выполнить поиск сжатых данных.
В отличие от имен сжатых файлов, которые 7z хранит в несжатом виде, фактические данные файла хранятся в измененном состоянии (измененном в процессе сжатия).
Если вы хотите найти его, вам придется распаковать его.
Что вы можете сделать, так это автоматизировать этот процесс с помощью сценария, чтобы не оставлять несжатые файлы без присмотра.
Например, 7z может выводить на стандартный вывод, поэтому вы можете передать результаты напрямую в grep:
for FILE in *.7z; do
7z e -so ${FILE} | grep '127\.0\.0\.1'
done
В качестве альтернативы вы можете извлечь файл обычным образом, а затем удалить его, если grep ничего не нашел, или оставить его несжатым для дальнейшей проверки, если grep действительно нашел IP-адрес, который вы искали:
for FILE in *.7z; do
7z e ${FILE}
LOG=${FILE%7z}log
grep -q '127\.0\.0\.1' ${LOG}
if [ $? -ne 0 ]; then
rm ${LOG}
fi
done
Ваш вопрос касается Linux, но это не совсем вопрос программирования. Такие вопросы здесь не по теме, но они актуальны на serverfault.com. Пожалуйста, посетите этот сайт и повторно спросите там.