Conheça estes 7 motivos para abandonar o comando grep e passar a usar o ack.

Tecnicamente, o ack foi projetado como ferramenta de busca dentro de arquivos texto — tendo como público-alvo os programadores.
Entre estes, o utilitário é mais eficiente do que o comando grep.
Neste texto, vou mostrar algumas vantagens de uso do ack e como instalar a ferramenta no Linux (caso ela já não esteja instalada aí).
Entre as vantagens de usar o ack — para fazer pesquisa dentro do código fonte — a documentação oficial cita:

  1. É rápido — por que se restringe a strings que “façam sentido” retornar. As expressões regulares em Perl tem alto índice de otimização.
  2. É portável — por ser escrito em Perl e não ter outras dependências além do Perl 5, pode rodar no Windows, MAC, UNIX e nos vários sabores do BSD e do Linux.
  3. Ignora automaticamente diretórios irrelevantes para a sua busca — a recursividade é seu comportamento padrão, mas ele ignora arquivos .git, .svn e diretórios CVS e VCS. Lógico que você pode mudar isto manualmente.
    Como exemplo da praticidade, a documentação compara os dois comandos de busca, a seguir, que tem resultados semelhantes:

    grep pattern $(find . -type f | grep -v '\.git')
    

    ou

    ack pattern
    

    Qual você prefere?

  4. Melhores resultados — como ele prioriza arquivos de código fonte, você obtém menos resultados irrelevantes. Ele pula até arquivos de backup.
  5. Separa fácil os arquivos — para quem tem um projeto envolvendo mais de uma linguagem de programação (muito comum entre web developers).
    É fácil adicionar –python, para restringir as buscas dentro de arquivos da linguagem Python, ou –nohtml evitar arquivos HTML.

    O ack tem detecção de tipos de arquivos, muito além da leitura da extensão do nome.

    Veja outra comparação entre comandos grep e ack, para realizar buscas dentro de arquivos Perl:

    grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .git)
    
    ack --perl pattern 
    

    Novamente, qual dos dois comandos, acima, você prefere usar?
    Note que o sucesso do grep, no primeiro exemplo, depende do uso do comando find (leia mais sobre ele aqui). O ack é visivelmente mais eficiente, neste caso.

  6. Listas de arquivos — podem ser criadas, antes mesmo de qualquer busca.
    Esta utilidade vai agradar até quem não é programador. Com o comando, abaixo, o ack relaciona todos os arquivos da linguagem PHP, em um diretório, recursivamente:

    ack -f --php
    

    Você gastaria um pouco mais de seus dedos para realizar esta tarefa com o find…

  7. O ack tem highlighting, que permite realçar palavras-chave nos resultados das buscas.

linux terminal ack command
Por fim, A palavra “ack” é menor do que “grep”, o que te poupa alguns preciosos milésimos de segundos na digitação a cada vez que precisar realizar uma busca.

Como instalar o ack no sistema

O ack está disponível nos repositórios das principais distribuições (se não todas) Linux e UNIX (BSD).
Infelizmente, no momento em que escrevo este texto, ele ainda não faz parte do conjunto de programas utilitários padrão, que já “estão lá”, logo após a instalação.
Contudo, ele é super fácil de instalar.
Quem usa o Debian, pode usar o apt, para fazer o trabalho:

sudo apt update
sudo apt install ack

No Ubuntu 16.04 LTS, o nome do pacote (transitório) é ack-grep. Nas futuras atualizações ele deve ser renomeado para apenas “ack”.
O pessoal do Fedora, pode instalar com o dnf:

sudo dnf install ack

No FreeBSD, use os ports e instale o pacote p5-ack.
Leia outros textos sobre o assunto, tocando ou clicando na tag ack, para conhecer melhor a ferramenta.
Além disto, não esqueça de compartilhar o texto nas redes sociais. 😉

Referências

https://beyondgrep.com/.
http://www.activestate.com/blog/2016/12/grep-losing-its-grip.

Conteúdo relacionado pelo Google

10 dicas para personalizar o prompt do seu terminal

Quem usa o terminal com frequência pode ver grande utilidade na exibição de determinadas informações na linha de comando, na parte que vem antes do cursor.
A personalização pode ser uma brincadeira muito divertida para usuários comuns — mas os administradores, que precisam acessar servidores diferentes podem se beneficiar com command line prompts diferenciados (o que ajuda a saber exatamente em que servidor e diretório você está executando algum comando).
Na série de artigos Como personalizar o prompt da linha de comando no UNIX/Linux, abordei várias formas de configurar:

  • parte 1  — ajustes básicos do prompt
  • parte 2  — como adicionar informações do sistema ao prompt e tornar as mudanças definitivas
  • parte 3  — como colorir o prompt de comando
  • parte 4  — como passar informações do prompt para a barra de títulos do seu terminal

Se você tiver dúvidas, sugiro a leitura dos textos acima. Assim evitamos redundâncias neste artigo e que ele fique mais longo do que o necessário. 😉

Em outras palavras, este post assume que você já detém o conhecimento do que foi discutido naqueles artigos, de forma que possamos ser bem mais objetivos aqui.

Se você acompanhar as tags emulador de terminal e bash vai encontrar outros textos interessantes relacionados a este assunto também.

Exemplos de prompt que você pode experimentar agora

Os exemplos, que seguem, podem ser experimentados de imediato. Basta copiar e colar no seu terminal Linux, Unix ou mesmo no Bash do Windows (eu não testei isso).
Sinta-se encorajada(o) a modificá-los para atender melhor às suas necessidades. Se quiser compartilhar alguma dica de uso, fique á vontade para postar nos comentários.
Como primeiro exemplo, veja este prompt que exibe um smiley sorrindo para comandos normais e um triste para quando você digitar um comando errado:

PS1="\t \w \`if [ \$? = 0 ]; then echo \:\); else echo \:\(; fi\` " 

experimente digitar comandos errados, para ver a mudança no “humor” do smiley.
O código abaixo, exibe uma carinha um pouco diferente para cada tipo de “humor”:

PS1="\`if [ \$? = 0 ]; then echo \\\^\\\_\\\^; else echo \\\-\\\_\\\-; fi\`*\u \w:\h)"

Uma variação deste prompt, exibe um smiley mais simples:

PS1="\t \w \`if [ \$? = 0 ]; then echo \:\); else echo \:\(; fi\` " 

Os próximos exemplos usam smileys coloridos:

PS1="\[\e[01;32m\]\u@\h \[\e[01;34m\]\W \`if [ \$? = 0 ]; then echo -e '\e[01;32m:)'; else echo -e '\e[01;31m:('; fi\` \[\e[01;34m\]$\[\e[00m\]"

A configuração abaixo acrescenta o número do comando no histórico, no começo da linha.

PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`[\u@\h:\w]\\$ "

Se quiser saber mais sobre as cores e seus códigos, clique aqui.
Prompts em múltiplas linhas, podem conter uma quantidade maior de informações. Por outro lado, alguns usuários acham que isto polui o visual do terminal, que deveria ser um pouco mais espartano.
exemplo de prompt de comando
Se você não se importa com uma ou duas linhas a mais no prompt, mas prefere obter algumas informações imediatas, o exemplo que segue exibe o número de arquivos presentes no diretório atual e o espaço ocupado por eles.

PS1="\n\[\033[35m\]\$(/bin/date)\n\[\033[32m\]\w\n\[\033[1;31m\]\u@\h: \[\033[1;34m\]\$(/usr/bin/tty | /bin/sed -e 's:/dev/::'): \[\033[1;36m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files \[\033[1;33m\]\$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\033[0m\] -> \[\033[0m\]"

Ao contrário do anterior, este é simples (espartano), só que usa cores. Você pode usá-lo, como base, para criar algo mais sofisticado.

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Segue uma versão minimalista em 2 linhas:

PS1="[\[\033[32m\]\w]\[\033[0m\]\n\[\033[1;36m\]\u\[\033[1;33m\]-> \[\033[0m\]"

Gosto muito desta versão, abaixo, com informações sobre o diretório atual e sem excesso de cores:

PS1="\n\[\e[30;1m\]\[\016\]l\[\017\(\[\e[34;1m\]\u@\h\[\e[30;1m\])-(\[\e[34;1m\]\@ \d\[\e[30;1m\])->\[\e[30;1m\]\n\[\016\]m\[\017\]-(\[\[\e[32;1m\]\w\[\e[30;1m\])-(\[\e[32;1m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files, \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\e[30;1m\])--> \[\e[0m\]"

Atualmente, gosto do meu assim:

PS1="\n\[\e[34;1m\]\u@\h\[\e[30;1m\] \[\e[34;1m\][ \d, \@]\[\e[30;1m\]\n\[\e[30;1m\]kernel: \$(/bin/uname -r)\n\[\e[32;1m\]\w\[\e[30;1m\] (\[\e[34;1m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') arquivos, \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\e[30;1m\])--> \[\e[0m\]"

Referências

https://slashdot.org/comments.pl?sid=108424&cid=9219400.
https://www.maketecheasier.com/8-useful-and-interesting-bash-prompts/.

Conteúdo relacionado pelo Google

Como personalizar o prompt da linha de comando no UNIX/Linux — parte 4

A personalização do prompt da linha de comando pode ir além de todas aquelas as informações sobre o sistema antes do cursor.
Se você prefere ter menos “coisas” no prompt, mas não quer abrir mão de algumas informações, saiba que é possível enviar alguns destes itens para a barra de títulos do console.
Tudo o que você precisa é acrescentar um pouquinho de código ao que você já tem no seu PS1 — como foi abordado na parte 1, parte 2 e parte 3 desta série de artigos.
O pedaço de código a mais segue aí, embaixo:

"\e]2;texto para a barra de titulo\a"

Basta substituir a cadeia “texto para a barra de titulo” pelo que você achar melhor.
O código para inserir data e hora na barra de título segue abaixo:

\e]2;\d, \t - \u@\h\a

Para ter efeito imediato, acrescente este código ao valor do seu PS1, conforme destacado, abaixo:

PS1='\e]2;\d, \t - \u@\h\a \[\e[0;33m\][\T]\n\[\e[1;36m\] \w > \[\e[0;32m\]'

data hora barra de título

Obviamente, o recurso nem sempre vai funcionar. Quando você estiver usando uma interface 100% caractere (CLI), conectado remotamente a um sistema headless ou, simplesmente, usando o terminal em tela cheia (F11), por exemplo.
Nestes casos, não será possível ver qualquer barra de títulos.

Conteúdo relacionado pelo Google

Como pesquisar eficientemente no histórico de comandos da Bash shell

Na linha de comandos, frequentemente queremos repetir algum procedimento, na íntegra ou com algumas modificações.
Para isso, há o histórico do Bash.
Você pode acessar o histórico da shell no arquivo .bash_history, que fica no seu diretório “home”. Veja como:

less ~/.bash_history

Você pode obter a mesma listagem, acrescida do número da linha de comando, com o próprio comando history:

history | less

Os números das linhas são úteis, por que podem ser evocados a qualquer momento no terminal. Ou seja, você não precisa redigitar o comando inteiro — basta fornecer o número dele no histórico.
Você pode combinar o history com o comando grep, para obter um histórico sobre um determinado item, que você tenha usado recentemente.
O exemplo abaixo lista o histórico de uso do comando apt:

history | grep apt

Veja como ficou a minha saída:

 1637  sudo apt install toilet
 1666  sudo apt update
 1667  apt list --upgradable 
 1668  apt show firmware-amd-graphics 
 1670  sudo apt autoremove 
 1671  sudo apt update
 1672  sudo apt full-upgrade 
 1673  sudo apt purge firmware-amd-graphics 
 1998  apt show zenity

Note que cada linha tem um número.
Se você quiser executar uma determinada linha de comando, use o símbolo ‘ ! ‘ (ponto de exclamação) seguido do número da linha correspondente:

!1668

history bash shell

Faça buscas por palavras dentro do histórico de comandos do Bash

Novamente, o comando grep pode ser usado para encontrar um nome de comando ou qualquer outra string dentro do .bash_history:

history | grep snap

Com o atalho de teclado ‘Ctrl+R’, é possível também fazer uma busca por uma string qualquer:

  • pressione simultaneamente as teclas ‘Ctrl’ e ‘R’
  • comece a digitar parte da palavra que deseja buscar
  • continue a pressionar ‘Ctrl+R’ até encontrar a linha de comando desejada

Quando encontrar, use a tecla de direcionamento para a direita ‘ → ‘, se quiser alterar o comando ou apenas tecle Enter, para executá-lo do jeito que ele já está.

Conteúdo relacionado pelo Google

Como personalizar o prompt da linha de comando no UNIX/Linux — parte 3

Neste texto vou mostrar como é fácil aplicar cores às informações exibidas no prompt da linha de comando do seu terminal.
Esta é a terceira parte de uma série de artigos sobre como configurar o prompt do seu emulador de terminal e serve para todos os Linux e UNIX (o que inclui os BSD e o MacOS), desde que estejam usando o Bash como emulador — por causa disto, talvez dê para incluir o Windows também nesta história.
Como, neste momento, não tenho um Mac em mãos, só pude testar os exemplos dados no Linux (Fedora 25, Debian 9 e OpenSUSE Tumbleweed).
Se você tiver alguma dúvida, durante a leitura, dê uma olhada nos links ou nos outros artigos (parte 1 e parte 2) desta série — tenho certeza de que a resposta estará em um destes lugares.

A tabela de cores

Use a relação de códigos de efeitos e cores, abaixo, para alterar os exemplos de prompt.

  • 0 —  efeito nenhum
  • 1 —  efeito negrito ou cor mais forte. Transforma a cor preta em cinza em alguns terminais
  • 2 —  efeito esmaecido ou mais fraco. Transforma a cor branca em cinza em alguns terminais
  • 3 —  efeito itálico
  • 4 —  efeito sublinhado
  • 7 —  efeito de inversão das cores
  • No tempo dos monitores monocromáticos, em fósforo, os efeitos eram muito úteis para ajudar a diferenciar tipos de arquivos e tornar mais legíveis os textos de interação com os usuários em scripts.
    Segue a lista de cores de frente ou foreground:

  • 30 —  preto
  • 31 —  vermelho
  • 32 —  verde
  • 33 —  amarelo
  • 34 —  azul
  • 35 —  púrpura
  • 36 —  ciano
  • 37 —  branco
  • Segue a lista de cores de fundo ou background:

  • 40 —  preto
  • 41 —  vermelho
  • 42 —  verde
  • 43 —  amarelo
  • 44 —  azul
  • 45 —  púrpura
  • 46 —  ciano
  • 47 —  branco

Os primeiros códigos (referentes aos efeitos) não irão funcionar em todos os emuladores de terminal. Portanto, não espere muito deles.
Você também pode encontrar uma tabela de cores no site do Mewbie: http://www.mewbies.com/geek_fun_files/color_scripts/color_scripts_codes.png.
ansi color codes table

Experimente as cores

As relações de cores ANSI podem ser usados em várias ocasiões. Quando estiver fazendo um script, na maioria das linguagens é possível colorir o texto de saída, para interagir com o seu usuário.
Você pode usar este código Bash, para experimentar as cores e os efeitos dados acima:

# as letras do texto na cor ciano ou cyan
echo -e "\e[36mQue cor é esta?"

Se quiser alterar apenas a cor de fundo…

# cor de fundo vermelho
echo -e "\e[41mQue cor é esta?"

Para aplicar o efeito negrito:

# vermelho forte
echo -e "\e[1;31mQue cor é esta?"

Aplique o efeito itálico; cor de frente ciano; cor de fundo amarelo:

echo -e "\e[3;36;43mQue cor é esta?"

Eu sei que dá para ficar brincando horas com isso aí… mas a gente precisa voltar a falar do command prompt.

Como aplicar cores ao prompt da linha de comando

Baseado nos exemplos dos artigos anteriores, aplique as cores, inserindo um dos códigos dos exemplos acima, tal como destacado abaixo:

PS1='\[\e[3;36m\][\d, \T]\n\[\e[0;33m\]\u@\h\[\e[1;36m\][ \w ] '

Note que a diferença é que o código de cores do PS1 precisa estar entre os caracteres “ \[\e[ ” e “ \] “.
Sinta-se à vontade para compartilhar, nos comentários, como você configurou o seu prompt!

Referências

http://www.mewbies.com/acute_terminal_fun_08_get_colorized_on_the_terminal.htm#color_scripts.
https://en.wikipedia.org/wiki/ANSI_escape_code#Colors.

Conteúdo relacionado pelo Google