Найден в скрипте Unix для поиска в файле .tar или .gz :
Сценарий :
for file in $(tar -tzf file.tar.gz | grep '\.txt'); do
tar -Oxzf file.tar.gz "$file" | grep -B 3 --label="$file" -H "string-or-regex"
done
будет уважать границы файлов и сообщать имена файлов. | grep '\.txt
часть может быть адаптирована к вашим потребностям или удалена.
(-z
сообщает tar
что сжато gzip
. -t
перечисляет содержимое. -x
извлекает. -O
перенаправляет на стандартный вывод, а не на файловую систему. Старые tar
ы могут не иметь флаг -O
или -z
и будут хотеть флаги без -
: например, tar tz file.tar.gz
)
Если ваш grep не поддерживает эти флаги, то можно использовать awk:
#!/usr/bin/awk -f
BEGIN { context=3; }
{ add_buffer($0) }
/pattern/ { print_buffer() }
function add_buffer(line)
{
buffer[NR % context]=line
}
function print_buffer()
{
for(i = max(1, NR-context+1); i <= NR; i++) {
print buffer[i % context]
}
}
function max(a,b)
{
if (a > b) { return a } else { return b }
}
Это не будет объединять смежные совпадения, в отличие от grep -B, и, таким образом, может повторять строки, которые находятся в пределах 3 строк двух разных совпадений.