Preciso de ajuda com Grep para começar em uma seção

8

Eu tenho alguns arquivos de texto dos quais quero extrair uma seção de código. O objetivo que estou tentando alcançar é iniciar a visualização em uma determinada linha & amp; então seja capaz de ler qualquer coisa abaixo dela. Por exemplo. No texto abaixo, como visualizo o arquivo de texto no ponto inicial de amarelo. Quero ver o conteúdo de "amarelo" e tudo o que está abaixo dele, independentemente do conteúdo.

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough
    
por john smith 30.01.2016 / 22:06

5 respostas

9

AWK Use AWK - é o mais simples possível:

awk '/yellow/,0' textfile.txt

Execução de amostra

$ awk '/yellow/,0' textfile.txt                                
yellow
red
orange
more orange
more blue
this is enough

Grep

Você também pode usar a opção grep with --after-context para imprimir determinada quantidade de linhas após a correspondência

grep 'yellow' --after-context=999999  textfile.txt

Para configuração automática de contexto, você pode usar $(wc -l textfile.txt) . A idéia básica é que, se você tiver uma primeira linha como uma correspondência e quiser imprimir tudo depois dessa partida, precisará saber o número de linhas no arquivo menos 1. Felizmente, --after-context não emitirá erros sobre o número de linhas, então você pode dar um número completamente fora do intervalo, mas caso você não saiba, o número total de linhas será

$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough

Se você quiser encurtar o comando --after-context é a mesma opção que -A e $(wc -l textfile.txt) , expandirá para o número de linhas seguidas pelo nome do arquivo. Dessa forma, você digita textfile.txt somente uma vez

grep "yellow" -A $(wc -l textfile.txt)

Python

skolodya@ubuntu:$ ./printAfter.py textfile.txt                                 
yellow
red
orange
more orange
more blue
this is enough

DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py                                          
#!/usr/bin/env python
import sys

printable=False
with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
           printable=True
        if printable:
           print line.rstrip('\n')

Ou alternativamente sem printable flag

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
          for lines in f: # will print remaining lines
             print lines.rstrip('\n')
          exit()
    
por Sergiy Kolodyazhnyy 30.01.2016 / 22:10
5

Você pode fazer isso por:

awk '/yellow/{f=1}f' file

em que "file" é o nome do arquivo que contém seu texto.

    
por Pilot6 30.01.2016 / 22:09
5

Não é grep , mas usa sed :

sed -n '/^yellow$/,$p' file
  • -n : inibe a impressão
  • /^yellow$/,$ : intervalo de endereços que vai desde a primeira ocorrência de uma linha correspondente exatamente a yellow até a última linha, inclusive
  • p : imprime as linhas no intervalo de endereços
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough
    
por kos 30.01.2016 / 22:49
5

Tarde para a festa:)

Usando grep :

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P nos permite usar o Regex compatível com Perl

  • -z torna o arquivo de entrada separado por ASCII NUL, em vez dessa nova linha

  • -o leva apenas a parte desejada

  • (?s) é o modificador DOTALL, nos permite corresponder a nova linha usando o token . (qualquer caractere)

  • Em \n\K , \n corresponde a uma nova linha, \K descarta a correspondência

  • yellow\n.* corresponde yellow seguido por uma nova linha e tudo depois disso também é selecionado e mostrado na saída.

Exemplo:

% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough

Usando pouco python :

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines é a lista que contém todas as linhas do arquivo (com novas linhas finais também)

  • lines.index('yellow\n') nos fornece o menor índice de lines , onde yellow\n é encontrado

  • lines[lines.index('yellow\n'):] usará o fatiamento da lista para obter a parte que começa em yellow\n até o final

  • join unirá os elementos da lista para gerar como uma string

por heemayl 31.01.2016 / 03:17
4

Como a pergunta se refere a visualizar o arquivo, há sempre o bom e velho

less +/yellow file
    
por steeldriver 31.01.2016 / 15:31