Destaque a saída de pesquisa do console, enquanto exibe toda a saída do comando

19

Quando uso, por exemplo cat file.txt | grep --color=tty "pattern", obtenho o padrão que busco realçado. Quando eu quero um pouco mais de contexto em torno de cada ocorrência, o grep possui os parâmetros -A, -Be -C.

No entanto, quero exibir o arquivo inteiro (ou qualquer outra saída de comando) e destacar um determinado padrão. Existe um comando ou ferramenta de destaque?

DerMike
fonte
Como o que você quer fazer agora é diferente do que você já faz?
Benjamin Bannier

Respostas:

22

Havia uma resposta no unix.stackexchange.com que tinha esse truque:

grep -E --color 'pattern|$' file.txt

ou

grep --color 'pattern\|$' file.txt

que corresponde ao seu padrão ou ao final da linha em cada linha. Somente o padrão é destacado.

Pausado até novo aviso.
fonte
+1 Simples e facilmente adaptável ao zgrep, bzgrep, etc.
Stefan Lasiewski
Existe alguma maneira de evitar digitar --color o tempo todo? Eu acho que é bastante básico incorporar a opção de cores no grep, não sei por que digitamos cores explicitamente todas as vezes. Eu tentei criar scripts que dizem que os arquivos grepd têm uma mensagem dizendo grep --color $ 1 $ 2, mas não funciona. Qualquer indício aqui para corrigir isso por favor
Srujan Kumar Gulla
11
@lordlupin: adicione GREP_OPTIONS='--color'ao ~/.bashrc(ou modifique a configuração para incluir --color). Você precisará iniciar um novo terminal ou executar essa atribuição na linha de comando no terminal atual para que ela entre em vigor.
Pausado até novo aviso.
9

Eu gosto de ack .

ack --passthru somepattern filename

É como grep, mas melhor. Ele destaca por padrão e, com a --passthruopção, mostra o arquivo inteiro (ou entrada padrão) em vez de apenas as linhas correspondentes.

Adam Batkin
fonte
11
Se você estiver tentando canalizar a saída para o ack, por exemplo tail, from , também precisará usar a --filteropção. Por exemplo:tail -f myLogFile | ack --filter --passthru pattern
sparrowt 28/11/2013
5

Também recomendo o uso de less(ou tal), mas quero mostrar uma solução mais didática. Depois de definir esta função:

função destaque ()
{
    sed "s / $ 1 /` tput smso` e `tput rmso` / g" "$ {2: -}"
}

Você pode usá-lo desta maneira:

command | highlight pattern
highlight pattern file.txt

Nota: Esta versão faz distinção entre maiúsculas e minúsculas, para alterar isso apenas idepois gda sedexpressão.

cYrus
fonte
11
Eu chamaria em tputvez de codificar os valores. Dessa forma, você também evita o uso echo -e, o que pode ter outros efeitos.
Ignacio Vazquez-Abrams
Você está absolutamente certo, eu procurei sem sorte. Obrigado.
CYrus 13/10/10
Esta versão não precisa dos parênteses de captura e pode ser executada por prog | highlight "pattern"ou highlight "pattern" file:highlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
Pausada até novo aviso.
Minhas sedhabilidades são basicamente inexistentes. Como eu teria que mudar isso para corresponder ao padrão que diferencia maiúsculas de minúsculas. De qualquer forma, adicionarei esse item às minhas funções bash_funções. Muito obrigado.
DerMike 14/10/10
@ DerMike: Agora faz distinção entre maiúsculas e minúsculas.
CYrus 14/10
3

Passar -Cpara grepcom um valor suficientemente alto fará isso.

Ignacio Vazquez-Abrams
fonte
Eu poderia jurar que tenho outra coisa da última vez que tentei isso. (Cada partida corresponde ao contexto com separadores '-----' no meio.) Agora que você me disse, ela funciona bem :-) Obrigado.
DerMike 14/10/10
Separará cada partida, se não houver contexto suficiente.
Ignacio Vazquez-Abrams
3

less está destacando o padrão, então

less -p 'mypattern' file.txt

ou

ridiculously | long | pipe | less

e depois em menos, /para procurar um padrão que será destacado.

Nota:

Você pode melhorar seu comando, por exemplo,
definir alias alias grep="grep --color=tty"e usá-lo assim:

grep 'mypattern' file.txt;
Casual Coder
fonte
11
você deve se abster de usar GREP_OPTIONS, use o alias. Veja: bugs.launchpad.net/ubuntu/+bug/67141
lesmana
Primum non nocere. removido.
Casual Coder
GREP_OPTIONS é usado por muitas formas de grep(zgrep, bzgrep, bzfgrep, etc.) Portanto, se você deseja que todas as formas de grep se comportem de maneira consistente, será necessário definir um alias para cada forma de grep. A nova resposta do @ Casual acima não servirá para algo como bzgrep pattern /var/log/messages.?.gz, que é um exemplo em que o realce de cores é MUITO útil.
Stefan Lasiewski
1

Existe uma boa ferramenta supercat , que serve exatamente para esse propósito. Ele pode colorir a saída do console e produzir um html "destacado" a partir da entrada.

Ivan Tarasov
fonte
Obrigado, isso parece promissor. No entanto, não consigo fazê-lo funcionar no momento.
DerMike
11
Dê uma olhada em seus arquivos de configuração (no /etc/supercatUbuntu), que configuram as regras de coloração, são basicamente pares color / regexp (com algumas regras extras); A página de manual também é curta e agradável.
Ivan Tarasov
Encontrei um spcrcarquivo de sintaxe vim em vim.org/scripts/script.php?script_id=2676
DerMike