AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1026045
Accepted
Socrates
Socrates
Asked: 2018-04-19 00:19:10 +0800 CST2018-04-19 00:19:10 +0800 CST 2018-04-19 00:19:10 +0800 CST

Limite a saída grep para linhas curtas

  • 772

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?

command-line grep text-processing
  • 2 2 respostas
  • 9333 Views

2 respostas

  • Voted
  1. Best Answer
    muru
    2018-04-19T00:32:00+08:002018-04-19T00:32:00+08:00

    grepem si só tem opções de contexto baseadas em linhas. Uma alternativa é sugerida por este post do SU :

    Uma solução alternativa é ativar a opção 'apenas correspondência' e, em seguida, usar o poder do RegExp para grep um pouco mais do que o seu texto:

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

    Obviamente, se você usar realce de cores, poderá sempre 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"
    

    Como outra alternativa, eu sugeriria foldo texto e depois o grep, por exemplo:

    fold -sw 80 input.txt | grep ...
    

    A -sopção fará foldpush 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 jqetc. para impressão bonita e grep... ou apenas usar jqpara fazer a filtragem por si só...


    Este método GNU awk pode ser mais rápido:

    gawk -v n=50 -v RS='MyClassName' '
      FNR > 1 { printf "%s: %s\n",FILENAME, p prt substr($0, 0, n)}
      {p = substr($0, length - n); prt = RT}
    ' input.txt
    
    • Diga ao awk para dividir os registros no padrão em que estamos interessados ​​( -v RS=...) e o número de caracteres no contexto ( -v n=...)
    • Cada registro após o primeiro registro ( FNR > 1) é aquele em que o awk encontrou uma correspondência para o padrão.
    • Portanto, imprimimos nos caracteres finais da linha anterior ( p) e nos caracteres iniciais da linha atual ( substr($0, 0, n)), juntamente com o texto correspondente da linha anterior (que é prt)
      • definimos pe prt depois de imprimir, então o valor que definimos é usado pela próxima linha
      • RTé um GNUismo, é por isso que é específico do GNU awk.

    Para pesquisa recursiva, talvez:

    find . -type f -exec gawk -v n=50 -v RS='MyClassName' 'FNR>1{printf "%s: %s\n",FILENAME, p prt substr($0, 0, n)} {p = substr($0, length-n); prt = RT}' {} +
    
    • 16
  2. Robert Riedl
    2018-04-19T01:29:54+08:002018-04-19T01:29:54+08:00

    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

    grep -RnHo 'MyClassName'
    
    • n saída numérica, mostra o número da linha da correspondência
    • H filename, mostra o nome do arquivo no início da linha da correspondência
    • o apenas corresponde, mostra apenas a string correspondente, não a linha inteira
    • 3

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve