eu sei que
grep -rhI "# Active" > out.txt
irá gerar qualquer linha contida # Active
no diretório pesquisado, mas eu quero todo o conteúdo do arquivo .txt, por exemplo
exemplo.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
Então, se eu usar o grep, # Active
quero que ele não apenas produza a linha que contém # Active
esse arquivo .txt, mas também todas as outras linhas, por exemplo
saída.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
Responder1
Para versões não-GNU do 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, normalmente, o status de saída é definido com base no fato de uma correspondência de padrão ter sido encontrada ou não. Com uma correspondência de padrão grep
retorna o código de sucesso 0
que é equivalente averdadeiroe isso permite que o cat
comando seja executado.
Responder2
Normalmente, grep mostrará apenas a linha correspondente:
$ grep -rhI "# Active"
Line3 # Active
Para ver o arquivo inteiro, adicione o -z
sinalizador:
$ grep -rhIz "# Active"
Line1
Line2
Line3 # Active
Line4
Line5
etc
-z
é uma extensão GNU que diz ao grep para não usar nova linha como separador de 'linha', mas sim 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 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 recursivamente.
-I
diz ao grep para ignorar arquivos binários
-h
diz ao grep para imprimir a correspondência sem o nome do arquivo anexado.
Responder3
sed
alternativa:
sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile
este script funciona acumulando linhas no h
buffer antigo (e excluindo-as) até que uma linha correspondente seja encontrada, momento em que ele x
altera os buffers e executa n
(ou seja, imprime e obtém a próxima linha) até que não haja mais entrada.
Responder4
Se você quiser fazer isso em vários arquivos:
cat `grep -rIl "# Active" *`
Grep retornará a lista de nomes de arquivos e cat irá imprimi-los.