Digamos que tenho o seguinte arquivo:
$ cat test
test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4
Por padrão, grep
retorna cada linha que contém o termo de pesquisa:
$ grep test test
test line 1
test line 2
test line 3 with two test words
test line 4
Passar o --color
parâmetro para grep
fará com que ele destaque a parte da linha que corresponde à expressão de pesquisa, mas ainda retorna apenas as linhas que contêm a expressão. Existe uma maneira de obter grep
todas as linhas no arquivo de origem, mas realce as correspondências?
Meu terrível truque atual para fazer isso (pelo menos em arquivos que não têm mais de 10000 linhas consecutivas sem correspondências) é:
$ grep -B 9999 -A 9999 test test
Se grep
não for possível, existe outra ferramenta de linha de comando que ofereça a mesma funcionalidade? Eu brinquei com isso ack
, mas também não parece ter uma opção.
grep
highlighting
Michael Mrozek
fonte
fonte
-C 9999
no lugar de-A 9999 -B 9999
.Eu sempre faço:grep -C 9999 pattern file
Respostas:
O que estamos fazendo aqui é comparar com o
$
padrão e o padrão de teste, obviamente$
não tem nada para colorir, então apenas o padrão de teste fica colorido. O-E
apenas ativa a correspondência estendida de regex.Você pode criar uma função facilmente dessa forma:
fonte
highlight () { grep --color -E "$1|$" $2 ; }
. Uso:highlight test yourfile
"$2"
também deve ser citado.highlight () { grep --color -E "$1|$" "$@" }
que permite arquivos com espaço em branco em seus nomes e vários arquivos."$1"
nos arquivos. Usehighlight () { grep --color -E "$1|$" "${@:1}" }
para Ubuntu e Debian, use ack-grep em vez de ack
fonte
--regexp string
; o ack / ack-grep equivalente é--match string
ack --passthru
com perl:grep_passthrough () { ! perl -ne "print; \$e ||= /$@/; END{{exit \$e}}"; }
ack --passthru
também funciona em fluxos! Por exemplo,ifconfig | ack --passthru inet
Outra maneira de fazer isso corretamente e portably com
grep
(além de usar duas expressões regulares com alternância como na resposta aceita) é via o padrão nulo (e corda respectivamente null).Ele deve funcionar igualmente bem com os dois
-E
e com os-F
switches, pois, de acordo com o padrão :e
Então é simplesmente uma questão de correr
e respectivamente
fonte
grep -F -e '' -e 'string'
.seq 3 | grep -F -e '' -e 2
gera apenas 2 em 2,27 (e 2,26, mas não 2,25, e não na cabeça do git). Somente com-F
(não sem ou com -E). IOW, apenas 2.26 e 2.27 parecem ter o erro e apenas com -F.seq 3 | grep -F -e '' -e '' -e 2
parece funcionar bem com 2.27-F
, aliviando a necessidade de se preocupar com o que os personagens aparecemstring
. Você pode querer mencionar--color
; À medida que essa resposta flutua na página (quando vista por votos), mais pessoas podem acabar lendo-a antes das outras respostas.Eu tenho a seguinte função que eu uso para essas coisas:
Internamente, parece meio feio, é agradável e fácil de usar, assim:
ou, para um exemplo um pouco mais real:
Você pode alterar as cores para o que quiser (o que pode ser difícil com o grep - não tenho certeza) alterando o
1
e31
e43
(depois\e[
) para valores diferentes. Os códigos a serem usados estão por todo o lado , mas aqui está uma introdução rápida: o 1 coloca o texto em negrito, o31
torna vermelho e o43
amarelo fornece um fundo amarelo.32
ou33
seriam cores diferentes e44
ou45
seriam fundos diferentes: você entendeu a idéia. Você pode até fazê-lo piscar (com a5
) se quiser.Isso não usa módulos Perl especiais, e o Perl é quase onipresente, portanto, espero que funcione em qualquer lugar. A solução grep é muito inteligente, mas a opção --color no grep não está disponível em todos os lugares. Por exemplo, eu apenas tentei esta solução em uma caixa Solaris executando o bash e outro executando o ksh, e minha máquina local do Mac OS X executando o zsh. Tudo funcionou muito bem. Solaris engasgou com a
grep --color
solução, no entanto.Além disso, o ack é incrível, e eu o recomendo para quem ainda não o descobriu, mas tive alguns problemas ao instalá-lo em alguns dos muitos servidores em que trabalho. (Eu esqueço o porquê: acho que relacionado aos módulos Perl necessários).
Como acho que nunca trabalhei em uma caixa Unix que não tinha o Perl instalado (com exceção de sistemas do tipo incorporado, roteadores Linksys e outros), eu diria que essa é uma solução praticamente universal. .
fonte
Em vez de usar o Grep, você pode usar Menos:
Pesquisar assim:
/pattern
EnterIsso vai:
Para rolar para a próxima linha correspondente:
n
Para rolar para a linha correspondente anterior:
N
Para alternar o destaque: Esc
u
Além disso, você pode alterar a cor de destaque, se quiser.
fonte
Podes tentar:
No entanto, não é muito portátil e, mesmo que o Perl esteja instalado, você pode precisar fazer o download de outro módulo. Além disso, colorirá a linha inteira, não apenas a palavra de pesquisa.
fonte
ripgrep
Use
ripgrep
com seu--passthru
parâmetro:É uma das ferramentas de grepping mais rápidas , pois é construída sobre o mecanismo de expressão regular da Rust, que usa autômatos finitos, SIMD e otimizações literais agressivas para tornar a pesquisa muito rápida.
fonte
Existe uma maneira muito mais fácil de fazer isso no GNU grep, mas não acho que seja portátil (ou seja, BSD grep):
Em um tubo:
cat <file> | grep --color=always -z <query>
Em um arquivo:
grep --color=always -z <query> <file>
O crédito vai para a resposta de Cyrus aqui .
fonte
--color
não é normal também.)Nenhuma das respostas dadas até o momento fornece uma solução portátil .
Aqui é um portátil 1 função shell que eu já postado em um fechado como questão duplicado que não necessita de ferramentas padrão não ou extensões não padrão fornecidos com
perl
,ack
,ggrep
,gsed
,bash
e os gostos, mas só precisa de um shell POSIX e os utilitários obrigatórios POSIXsed
eprintf
:Você pode usá-lo dessa maneira:
A cor do destaque pode ser ajustada usando um destes códigos no argumento sed command (32m sendo verde aqui):
1 Desde que o seu terminal suporte sequências de escape de cores ANSI.
fonte
Uma
sed
versão, funciona em ambosbash
eash
.fonte
O OP pediu
grep
, e é isso que RECOMENDO ; mas depois de tentar resolver um problema comsed
, para constar, aqui está uma solução simples:ou
Pintará
main
em vermelho.\E[31m
: sequência de início de cor vermelha\E[0m
: marca de cor finalizada&
: o padrão correspondente/g
: todas as palavras em uma linha, não apenas a primeira$'string'
é bash strings com caracteres de escape interpretadosEm relação ao grep , ele também funciona usando
^
(início de linha) em vez de$
(fim de linha). Exemplo:E só para mostrar esse pseudônimo louco que NÃO RECOMENDO , você pode até deixar as aspas abertas:
todo o trabalho! :) Não se preocupe se você esquecer de fechar a cotação, o bash lembrará de você com um "caractere de linha contínua".
fonte