Кажется, что каждая запись, начинающаяся с ##########
, всегда имеет 6 строк. В этом случае было бы намного проще и эффективнее использовать grep -A7
вместо sed -n /##.../,/##.../p
. Я полагаю, вы распечатали только последующий заголовок, так как это было проще (по крайней мере, при использовании sed
). Поэтому я исключил последующий заголовок в этом ответе (grep -A6
вместо grep -A7
).
grep
можно указать список шаблонов для поиска. Это делается с помощью опции -f
. Список шаблонов можно сгенерировать из вашего файла. Сначала сгруппируйте по имени архива (например, test365
), а затем распечатайте все шаблоны для этого архива. Здесь мы используем awk
. Нулевой байт разделяет разделы шаблона для каждого архива.
Чтобы предотвратить ложные срабатывания (и, возможно, немного ускорить поиск), мы ищем только полные строки, а не подстроки. Для ускорения мы установили LC_ALL=C
. Вы также можете обнаружить, что zgrep
быстрее, чем zcat | grep
.
Следующий сценарий распаковывает каждый архив не более одного раза.
awk -v prefix='########## Name: ' '
{a[$1]=a[$1] "\n" prefix $2}
END {for (k in a) print k a[k] "\0"}
' /path/to/your/list.txt |
while IFS=$'\n' read -r -d '' archive patterns; do
LC_ALL=C zgrep -A6 -Fxf <(printf %s "$patterns") "${archive/\//.gz}"
# TODO do something with the output for this archive
done
В приведенном выше сценарии я преобразовал test365/
из ваш список до test365.gz
автоматически. Я не знаю вашу структуру каталогов. Если вам нужно что-то другое, адаптируйте последний аргумент zgrep
. $archive
выполняет итерацию по первому столбцу вашего ( сгруппированного ) списка (, то есть каждый архив указан только один раз ).
Из вашего примера кода кажется например, вы хотите создать отдельный файл для каждого шаблона. Для этого замените корпус l oop сверху на
zgrep ... > /tmp/zincfound
while IFS= read -r pattern; do
grep -A6 -Fx "$pattern" /tmp/zincfound > "${pattern##* }.out"
done <<< "$patterns"
rm /tmp/zincfound