Costumo usar o grep para encontrar arquivos com uma determinada entrada como esta:
grep -R 'MyClassName'
O bom é que ele retorna os arquivos, seus conteúdos e marca a string encontrada em vermelho. O ruim é que também tenho arquivos enormes onde todo o texto é escrito em uma única linha grande. Agora o grep produz muito ao encontrar texto nesses arquivos grandes. Existe uma maneira de limitar a saída para, por exemplo, 5 palavras à esquerda e à direita? Ou talvez limitar a saída a 30 letras à esquerda e à direita?
grep
em si só tem opções de contexto baseadas em linhas. Uma alternativa é sugerida por este post do SU :Como outra alternativa, eu sugeriria
fold
o texto e depois o grep, por exemplo:A
-s
opção faráfold
push words para a próxima linha em vez de quebrar no meio.Ou use alguma outra maneira de dividir a entrada em linhas com base na estrutura de sua entrada. (O post do SU, por exemplo, lidava com JSON, então usar
jq
etc. para impressão bonita egrep
... ou apenas usarjq
para fazer a filtragem por si só...Este método GNU awk pode ser mais rápido:
-v RS=...
) e o número de caracteres no contexto (-v n=...
)FNR > 1
) é aquele em que o awk encontrou uma correspondência para o padrão.n
os caracteres finais da linha anterior (p
) en
os caracteres iniciais da linha atual (substr($0, 0, n)
), juntamente com o texto correspondente da linha anterior (que éprt
)p
eprt
depois de imprimir, então o valor que definimos é usado pela próxima linhaRT
é um GNUismo, é por isso que é específico do GNU awk.Para pesquisa recursiva, talvez:
Usar apenas a correspondência em combinação com algumas outras opções (veja abaixo) pode estar muito próximo do que você está procurando, sem a sobrecarga de processamento do regex mencionado na outra resposta