grep caracteres circundantes de uma partida

8

Estou procurando fazer uma descoberta e substituição em um dump de banco de dados gigante, e ele não está fazendo o que eu acho que deveria acontecer. Eu gostaria de grep para minha seqüência de destino no arquivo e, em seguida, ver os cerca de 8 caracteres ou mais (talvez precise ajustar esse número, dependendo). Como posso fazer isso?

A razão pela qual eu não consigo ver isso é porque existem muitas centenas, se não milhares de partidas. Eu quero pegar um certo número de caracteres ao redor da string, e depois canalizá-lo para uniq ou algo para ver porque meu find e replace está tendo comportamentos inesperados.

Além disso, pode haver várias correspondências na mesma linha!

    
por user394 24.08.2011 / 22:00

2 respostas

13

O caminho bruto usando grep seria algo como

grep -o "....yourtext...." /path/to/the/dump.sql

O número de pontos corresponde ao número de caracteres antes / depois do texto. A opção -o torna grep output apenas as correspondências, não as linhas inteiras.

Para usar uniq na saída, lembre-se de que você precisa classificar a saída primeiro. Então, tipicamente, você faria

grep . . . | sort | uniq

Se você estiver interessado no hitcount de cada partida, você pode obter resultados interessantes usando

grep . . . | sort | uniq -c | sort -n
    
por 24.08.2011 / 22:37
7

A partir da resposta do @rozcietrzewiacz, posso expandir para

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file
    
por 24.08.2011 / 22:46