Como posso grep um determinado texto e exibir sua linha e a linha depois também

3

Eu tenho um arquivo semelhante a:

abcdef
123
ghiflk
234
sfhskdhf
483

Eu gostaria de pesquisar por uma string, e a saída deve incluir também a próxima (e / ou anterior) linha.

Então, por exemplo:

grep "bcd" myfile

Output:
abcdef
123

Ou mostre a linha anterior:

grep "ifl" myfile

Output:
123
ghiflk

Eu tentei por dias agora encontrar uma solução on-line, mas parece que não consigo descobrir.

    
por koljanep 24.10.2014 / 12:03

2 respostas

12

Os utilitários GNU e BSD grep têm a opção -A para linhas após uma correspondência e uma opção -B para linhas antes de uma correspondência. Assim, você pode fazer algo como:

$ grep -A 1 bcd myfile
abcdef
123

para mostrar a linha após a partida e

$ grep -B 1 ifl myfile
123
ghiflk

para mostrar a linha que precede a partida. Finalmente, você pode usar -C para mostrar N linhas antes e depois da partida:

$ grep -C 1 ifl myfile
123
ghiflk
234

Se a sua versão de grep não for compatível com esse recurso, você poderá tentar alguns outros métodos:

  • Usando as opções POSIX grep e sed junto com o shell:

    n=$(grep -n bcd foo | cut -d':' -f1); sed -n "${n},$((n + 1))p" myfile
    
  • Usando o AWK

    awk '/bcd/ {print; getline; print}' myfile
    

E muitos mais.

    
por 24.10.2014 / 12:10
5

Assim como as opções mencionadas por Steven D, o GNU grep aceita um arg (não documentado) para a opção -n que especifica o número de linhas a serem impressas antes e depois de uma linha correspondente. É claro que usar -n ativa a numeração de linhas, portanto, as opções -A e -B são melhores se você não quiser números de linha.

Por exemplo, grep -n1 pattern se comporta como grep -n -A1 -B1 pattern

Como don_crissti menciona nos comentários, esse não é um argumento não documentado para a opção -n . -NUM (onde NUM é um inteiro) é na verdade um sinônimo para a opção -C NUM , então -nNUM é efetivamente uma contração de -n -C NUM .

    
por 24.10.2014 / 13:10

Tags