O grep pode mostrar contexto, mas não uma linha completa?

3

Eu tenho um arquivo com várias linhas muito longas. Eu quero grep para uma string que pode ocorrer várias vezes no arquivo, incluindo possivelmente mais de uma vez na linha.

$ cat 2014-11-03.json | grep 218

Isso produz saída ilegível. Há muito disso.

$ cat 2014-11-03.json | grep -o 218

Isso reduz muito. Mostra apenas o padrão correspondente sem qualquer contexto.

Basicamente, quero saída como

... <category_id>218</category_id> ...

(Sim, isso é XML, mas eu não quero analisar XML. Eu só quero produzir a string combinada com alguns caracteres em cada lado dela. Apenas alguns caracteres, não a linha inteira.)

O grep parece ter opções para mostrar somente a string correspondente, ou a string correspondente no contexto de sua linha completa (o comportamento padrão) ou a string combinada no contexto de algumas linhas antes e depois, mas não consigo encontrar uma opção para mostrar a string combinada no contexto de alguns caracteres antes e depois.

$ cat 2014-11-03.json | tr ' ' '\n' | grep 218 

Isso não é ideal: funciona desde que o arquivo em questão tenha espaços próximos aos lugares certos. Funcionou para mim desta vez, mas não há garantia de que voltaria a acontecer.

    
por TRiG 05.11.2014 / 13:11

2 respostas

7

Esta pergunta é antiga, mas desde que eu tropecei nela enquanto procurava uma maneira de fazer apenas parte de uma linha, aqui vai:

Uma solução alternativa é habilitar a opção 'somente correspondência' e, em seguida, usar o poder do RegExp para obter um pouco mais de seu texto:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath

É claro que, se você usar o realce de cor, sempre poderá fazer o grep novamente para colorir apenas a correspondência real:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"

Nota:

  • isso pode não retornar todos os resultados esperados se você tiver várias correspondências por linha: o. {0,50} pode corresponder a parte da correspondência a seguir e, assim, impedir a correspondência.
  • Esse regex é lento. Muito devagar. (veja os comentários para uma possível solução)
por 26.11.2015 / 11:34
0

Bet maneira eu sei que para exibir json em um formato bonito está usando pjson. Após o formato, você pode adicionar seu comando grep.

$ echo '{"test1":"t1","test2":"t2"}' | pjson
{
   "test1": "t1",
   "test2": "t2"
}

Instale-o com pip :

pip install pjson

e, em seguida, canalize qualquer conteúdo do json para pjson .

    
por 05.11.2014 / 14:55