Introdução
O comando grep
é um dos comandos mais úteis em um ambiente de terminal Linux. O nome grep
significa “impressão global de expressão regular”. Isso significa que você pode usar o grep
para verificar se a entrada que ele recebe corresponde a um padrão especificado. Esse programa aparentemente trivial é extremamente poderoso; sua capacidade de classificar a entrada com base em regras complexas o torna um elo popular em muitas cadeias de comandos.
Neste tutorial, você explorará as opções do comando grep
e, em seguida, mergulhará no uso de expressões regulares para fazer buscas mais avançadas.
Pré-requisitos
Para acompanhar este guia, você precisará de acesso a um computador executando um sistema operacional baseado em Linux. Isso pode ser um servidor privado virtual ao qual você se conectou com SSH ou sua máquina local. Observe que este tutorial foi validado usando um servidor Linux executando Ubuntu 20.04, mas os exemplos fornecidos devem funcionar em um computador executando qualquer versão de qualquer distribuição Linux.
Se planeja usar um servidor remoto para seguir este guia, recomendamos que primeiro conclua nosso guia de Configuração Inicial do Servidor. Fazê-lo irá configurá-lo com um ambiente de servidor seguro — incluindo um usuário não root com privilégios de sudo
e um firewall configurado com UFW — que você pode usar para desenvolver suas habilidades no Linux.
Uso Básico
Neste tutorial, você usará o grep
para buscar a Licença Pública Geral GNU versão 3 por várias palavras e frases.
Se estiver em um sistema Ubuntu, pode encontrar o arquivo na pasta /usr/share/common-licenses
. Copie-o para o seu diretório pessoal:
Se estiver em outro sistema, use o comando curl
para baixar uma cópia:
Você também usará o arquivo de licença BSD neste tutorial. No Linux, pode copiá-lo para o seu diretório pessoal com o seguinte comando:
Se estiver em outro sistema, crie o arquivo com o seguinte comando:
Agora que tem os arquivos, pode começar a trabalhar com o grep
.
Na forma mais básica, você usa o grep
para corresponder padrões literais dentro de um arquivo de texto. Isso significa que se passar grep
uma palavra para buscar, ele imprimirá todas as linhas no arquivo contendo essa palavra.
Execute o seguinte comando para usar o grep
para buscar cada linha que contenha a palavra GNU
:
O primeiro argumento, GNU
, é o padrão que você está buscando, enquanto o segundo argumento, GPL-3
, é o arquivo de entrada que você deseja pesquisar.
O resultado será cada linha contendo o texto do padrão:
Output GNU GENERAL PUBLIC LICENSE
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
Developers that use the GNU GPL protect your rights with two steps:
"This License" refers to version 3 of the GNU General Public License.
13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single
...
...
Em alguns sistemas, o padrão que você buscou será destacado na saída.
Opções Comuns
Por padrão, o grep
irá buscar pelo padrão especificado exatamente dentro do arquivo de entrada e retornar as linhas encontradas. Você pode tornar esse comportamento mais útil adicionando algumas bandeiras opcionais ao grep
.
Se você deseja que o grep
ignore o “case” do seu parâmetro de busca e pesquise variações em maiúsculas e minúsculas, você pode especificar a opção -i
ou --ignore-case
.
Busque por cada instância da palavra license
(com variações de maiúsculas, minúsculas ou mistas) no mesmo arquivo que antes com o seguinte comando:
Os resultados contêm: LICENSE
, license
e License
:
Output GNU GENERAL PUBLIC LICENSE
of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for
The licenses for most software and other practical works are designed
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
(1) assert copyright on the software, and (2) offer you this License
"This License" refers to version 3 of the GNU General Public License.
"The Program" refers to any copyrightable work licensed under this
...
...
Se houvesse uma instância com LiCeNsE
, isso também teria sido retornado.
Se deseja encontrar todas as linhas que não contenham um padrão específico, pode usar a opção -v
ou --invert-match
.
Procure por cada linha que não contenha a palavra the
na licença BSD com o seguinte comando:
Você receberá esta saída:
OutputAll rights reserved.
Redistribution and use in source and binary forms, with or without
are met:
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...
Já que você não especificou a opção “ignorar maiúsculas e minúsculas”, os dois últimos itens foram retornados como não contendo a palavra the
.
É frequentemente útil saber o número da linha onde as correspondências ocorrem. Você pode fazer isso usando a opção -n
ou --line-number
. Re-execute o exemplo anterior com essa bandeira adicionada:
Isto retornará o seguinte texto:
Output2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13: may be used to endorse or promote products derived from this software
14: without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...
Agora você pode fazer referência ao número da linha se quiser fazer alterações em todas as linhas que não contenham the
. Isso é especialmente útil ao trabalhar com código fonte.
Expressões Regulares
Na introdução, você aprendeu que grep
significa “global regular expression print”. Uma “expressão regular” é uma sequência de texto que descreve um padrão de busca específico.
Diferentes aplicações e linguagens de programação implementam expressões regulares ligeiramente diferentes. Neste tutorial, você estará explorando apenas um pequeno subconjunto da maneira como grep
descreve seus padrões.
Correspondências Literais
Nos exemplos anteriores deste tutorial, quando você procurou pelas palavras GNU
e the
, na verdade estava procurando por expressões regulares básicas que correspondiam exatamente à cadeia de caracteres GNU
e the
. Padrões que especificam exatamente os caracteres a serem correspondidos são chamados de “literais”, porque correspondem ao padrão literalmente, caractere por caractere.
É útil pensar neles como correspondendo a uma cadeia de caracteres em vez de corresponder a uma palavra. Isso se tornará uma distinção mais importante à medida que você aprender padrões mais complexos.
Todos os caracteres alfabéticos e numéricos (bem como certos outros caracteres) correspondem literalmente, a menos que sejam modificados por outros mecanismos de expressão.
Correspondências de Âncora
Âncoras são caracteres especiais que especificam onde na linha uma correspondência deve ocorrer para ser válida.
Por exemplo, usando âncoras, você pode especificar que só deseja saber sobre as linhas que correspondem a GNU
no início exato da linha. Para fazer isso, você poderia usar a âncora ^
antes da cadeia literal.
Execute o seguinte comando para pesquisar no arquivo GPL-3
e encontrar linhas onde GNU
ocorre no início da linha:
Este comando retornará as seguintes duas linhas:
OutputGNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published
Da mesma forma, você pode usar o âncora $
no final de um padrão para indicar que a correspondência será válida apenas se ocorrer no final de uma linha.
Este comando corresponderá a cada linha que termina com a palavra and
no arquivo GPL-3
:
Você receberá esta saída:
Outputthat there is no warranty for this free software. For both users' and
The precise terms and conditions for copying, distribution and
License. Each licensee is addressed as "you". "Licensees" and
receive it, in any medium, provided that you conspicuously and
alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and
Correspondendo a Qualquer Caractere
O caractere ponto (.) é usado em expressões regulares para indicar que qualquer caractere único pode existir na posição especificada.
Por exemplo, para corresponder a qualquer coisa no arquivo GPL-3
que tenha dois caracteres e então a sequência cept
, você usaria o seguinte padrão:
Este comando retorna a seguinte saída:
Outputuse, which is precisely where it is most unacceptable. Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the
License by making exceptions from one or more of its conditions.
form of a separately written license, or stated as exceptions;
You may not propagate or modify a covered work except as expressly
9. Acceptance Not Required for Having Copies.
...
...
Esta saída possui instâncias tanto de accept
quanto de except
e variações das duas palavras. O padrão também teria correspondido a z2cept
se fosse encontrado também.
Expressões em Colchetes
Ao colocar um grupo de caracteres entre colchetes (\[
e \]
), você pode especificar que o caractere naquela posição pode ser qualquer caractere encontrado dentro do grupo de colchetes.
Por exemplo, para encontrar as linhas que contêm too
ou two
, você especificaria essas variações sucintamente usando o seguinte padrão:
A saída mostra que ambas as variações existem no arquivo:
Outputyour programs, too.
freedoms that you received. You must make sure that they, too, receive
Developers that use the GNU GPL protect your rights with two steps:
a computer network, with no transfer of a copy, is not conveying.
System Libraries, or general-purpose tools or generally available free
Corresponding Source from a network server at no charge.
...
...
A notação de colchetes oferece algumas opções interessantes. Você pode fazer o padrão corresponder a qualquer coisa exceto os caracteres dentro de um colchete começando a lista de caracteres dentro dos colchetes com um caractere ^
.
Este exemplo é semelhante ao padrão .ode
, mas não corresponderá ao padrão code
:
Aqui está a saída que você receberá:
Output 1. Source Code.
model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:
Observe que na segunda linha retornada, há, de fato, a palavra code
. Isso não é uma falha da expressão regular ou do grep. Em vez disso, essa linha foi retornada porque anteriormente na linha, o padrão mode
, encontrado dentro da palavra model
, foi encontrado. A linha foi retornada porque houve uma instância que correspondeu ao padrão.
Outra característica útil dos colchetes é que você pode especificar um intervalo de caracteres em vez de digitar individualmente cada caractere disponível.
Isso significa que se você quiser encontrar cada linha que começa com uma letra maiúscula, você pode usar o seguinte padrão:
Aqui está a saída que essa expressão retorna:
OutputGNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as "you". "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
...
...
Devido a alguns problemas de classificação legados, muitas vezes é mais preciso usar classes de caracteres POSIX em vez de intervalos de caracteres como você acabou de usar.
Discutir todas as classes de caracteres POSIX estaria além do escopo deste guia, mas um exemplo que realizaria o mesmo procedimento que o exemplo anterior usa a classe de caracteres \[:upper:\]
dentro de um seletor de colchetes:
A saída será a mesma do que antes.
Repetir Padrão Zero ou Mais Vezes
Finalmente, um dos meta-caracteres mais comumente usados é o asterisco, ou *
, que significa “repetir o caractere ou expressão anterior zero ou mais vezes”.
Para encontrar cada linha no arquivo GPL-3
que contenha um parêntese de abertura e fechamento, apenas letras e espaços simples entre eles, use a seguinte expressão:
Você obterá a seguinte saída:
Output Copyright (C) 2007 Free Software Foundation, Inc.
distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
(including a physical distribution medium), accompanied by the
(including a physical distribution medium), accompanied by a
place (gratis or for a charge), and offer equivalent access to the
...
...
Até agora, você usou pontos, asteriscos e outros caracteres em suas expressões, mas às vezes você precisa procurar por esses caracteres especificamente.
Escapando Meta-Caracteres
Há momentos em que você precisará buscar um ponto literal ou um colchete de abertura literal, especialmente ao trabalhar com código-fonte ou arquivos de configuração. Como esses caracteres têm significado especial em expressões regulares, você precisa “escapar” esses caracteres para informar ao grep
que não deseja usar seu significado especial neste caso.
Você escapa caracteres usando o caractere barra invertida (\
) na frente do caractere que normalmente teria um significado especial.
Por exemplo, para encontrar qualquer linha que comece com uma letra maiúscula e termine com um ponto, use a seguinte expressão que escapa o ponto final para que ele represente um ponto literal em vez do significado usual de “qualquer caractere”:
Este é o resultado que você verá:
OutputSource.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.
Agora vamos olhar para outras opções de expressão regular.
Expressões Regulares Estendidas
O comando grep
suporta uma linguagem de expressão regular mais extensa usando a flag -E
ou chamando o comando egrep
em vez de grep
.
Essas opções abrem as capacidades das “expressões regulares estendidas”. Expressões regulares estendidas incluem todos os meta-caracteres básicos, juntamente com meta-caracteres adicionais para expressar correspondências mais complexas.
Agrupamento
Uma das habilidades mais úteis que as expressões regulares estendidas abrem é a capacidade de agrupar expressões juntas para manipular ou referenciar como uma unidade.
Para agrupar expressões juntas, envolva-as em parênteses. Se você gostaria de usar parênteses sem usar expressões regulares estendidas, você pode escapá-los com a barra invertida para habilitar esta funcionalidade. Isso significa que as seguintes três expressões são funcionalmente equivalentes:
Alternância
Similar às expressões de colchetes que podem especificar diferentes escolhas possíveis para correspondências de caracteres únicos, a alternância permite especificar correspondências alternativas para cadeias de caracteres ou conjuntos de expressões.
Para indicar alternância, use o caractere de pipe |
. Estes são frequentemente usados dentro de agrupamentos entre parênteses para especificar que uma das duas ou mais possibilidades deve ser considerada uma correspondência.
O seguinte irá encontrar tanto GPL
quanto Licença Pública Geral
no texto:
A saída parece assim:
Output The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
Developers that use the GNU GPL protect your rights with two steps:
For the developers' and authors' protection, the GPL clearly explains
authors' sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
...
...
A alternância pode selecionar entre mais do que duas escolhas adicionando escolhas adicionais dentro do grupo de seleção separadas por caracteres de pipe adicionais (|
).
Quantificadores
Assim como o meta-caractere *
que corresponde ao caractere anterior ou conjunto de caracteres zero ou mais vezes, existem outros meta-caracteres disponíveis em expressões regulares estendidas que especificam o número de ocorrências.
Para corresponder a um caractere zero ou uma vez, você pode usar o caractere ?
. Isso torna o caractere ou conjunto de caracteres que vieram antes opcional, essencialmente.
O seguinte corresponde a copyright
e right
colocando copy
em um grupo opcional:
Você obterá esta saída:
Output Copyright (C) 2007 Free Software Foundation, Inc.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
"Copyright" also means copyright-like laws that apply to other kinds of
...
O caractere +
corresponde a uma expressão uma ou mais vezes. Isso é quase como o meta-caractere *
, mas com o caractere +
, a expressão deve corresponder pelo menos uma vez.
A seguinte expressão corresponde à string free
mais um ou mais caracteres que não sejam caracteres de espaço em branco:
Você verá esta saída:
Output The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for
you modify it: responsibilities to respect the freedom of others.
freedomss that you received. You must make sure that they, too, receive
protecting users' freedom to change the software. The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.
Especificar Repetição de Correspondência
Para especificar o número de vezes que uma correspondência é repetida, use os caracteres de chaves ({
e }
). Esses caracteres permitem que você especifique um número exato, um intervalo ou um limite superior ou inferior para a quantidade de vezes que uma expressão pode corresponder.
Use a seguinte expressão para encontrar todas as linhas no arquivo GPL-3
que contêm triplos de vogais:
Cada linha retornada tem uma palavra com três vogais:
Outputchanged, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this
Para corresponder a palavras que tenham entre 16 e 20 caracteres, use a seguinte expressão:
Aqui está a saída deste comando:
Output certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
c) Prohibiting misrepresentation of the origin of that material, or
Apenas linhas contendo palavras com esse comprimento são exibidas.
Conclusão
grep
é útil para encontrar padrões dentro de arquivos ou na hierarquia do sistema de arquivos, então vale a pena passar tempo se familiarizando com suas opções e sintaxe.
Expressões regulares são ainda mais versáteis e podem ser usadas com muitos programas populares. Por exemplo, muitos editores de texto implementam expressões regulares para pesquisar e substituir texto.
Além disso, a maioria das linguagens de programação modernas usa expressões regulares para executar procedimentos em partes específicas de dados. Uma vez que você entenda as expressões regulares, será capaz de transferir esse conhecimento para muitas tarefas comuns relacionadas a computadores, desde realizar buscas avançadas em seu editor de texto até validar a entrada do usuário.