Encontrado em script Unix para pesquisar em um arquivo. arquivo tar ou .gz :
O script:
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
respeitará os limites dos arquivos e reportará os nomes dos arquivos. A parte | grep '\.txt
pode ser adaptada às suas necessidades ou descartada.
( -z
informa tar
é gzip
compactado. -t
lista o conteúdo. -x
extractos. -O
redireciona para saída padrão em vez do sistema de arquivos.% mais antigostar
s podem não tem o sinal -O
ou -z
e desejará os sinalizadores sem -
: por exemplo, tar tz file.tar.gz
)
Se o seu grep não suporta estes flags, então pode-se usar o 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 }
}
Isso não aglutinará correspondências adjacentes, ao contrário de grep -B, e pode, portanto, repetir linhas que
estão dentro de 3 linhas de dois jogos diferentes.