Grep mantém (saída) todo o arquivo .txt se uma linha contiver uma string

4

Eu sei que

grep -rhI "# Active" > out.txt 

produzirá qualquer linha contendo # Active dentro do diretório pesquisado, mas eu quero todo o conteúdo do arquivo .txt, por exemplo

example.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

Então, se eu for grep para # Active , eu quero que ele não apenas exiba a linha contendo # Active dentro desse arquivo .txt, mas todas as outras linhas também, exemplo

output.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc
    
por UserExample 23.11.2017 / 23:36

4 respostas

12

Para versões não-GNU de grep , que provavelmente não terão -z , ou se a portabilidade for necessária ...

grep -q pattern file && cat file

-q suprime qualquer saída, mas, por padrão, o status de saída é definido com base em se uma correspondência de padrão foi encontrada ou não. Com uma correspondência de padrão grep retorna o código de sucesso 0 que é equivalente a verdadeiro e que permite que o comando cat seja executado.

    
por 23.11.2017 / 23:45
8

Normalmente, o grep mostrará apenas a linha correspondente:

$ grep -rhI "# Active"
Line3 # Active

Para ver o arquivo inteiro, adicione o sinalizador -z :

$ grep -rhIz "# Active"
Line1 
Line2
Line3 # Active
Line4
Line5
etc

-z é uma extensão GNU que diz ao grep para não usar newline como o separador 'line', mas para usar um caractere NUL. Como os arquivos de texto geralmente não possuem caracteres NUL, isso tem o efeito de dizer ao grep para ler o arquivo inteiro como se fosse uma única 'linha'. Conseqüentemente, se houver uma correspondência, todo o arquivo será impresso.

Nas versões BSD / OSX do grep, a opção de entrada NUL não está disponível e -z significa outra coisa.

As outras opções do grep

-r diz ao grep para pesquisar arquivos e diretórios de forma recursiva.

-I diz ao grep para ignorar arquivos binários

-h diz ao grep para imprimir a correspondência sem o nome do arquivo anexado.

    
por 23.11.2017 / 23:46
3

sed alternative:

sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile

esse script funciona acumulando linhas no buffer h old (e excluindo-as) até que uma linha correspondente seja encontrada e, a partir desse ponto, x altera os buffers e executa n (ou seja, imprima & obtenha o próxima linha) até que não haja mais entrada.

    
por 24.11.2017 / 00:22
1

Se você quiser fazer isso em vários arquivos:

cat 'grep -rIl "# Active" *'

O grep retornará a lista de nomes de arquivos e o gato os imprimirá.

    
por 24.11.2017 / 13:09