Introdução ao Grep e expressões regulares

Introdução ao Grep e expressões regulares

Objetivo

Depois de ler este tutorial, você poderá entender como o comando Grep funciona e como usá -lo com expressões regulares básicas e estendidas.

Dificuldade

FÁCIL

Introdução

Grep é uma das ferramentas mais úteis que podemos usar ao administrar uma máquina baseada em UNIX: seu trabalho é procurar um determinado padrão dentro de um ou mais arquivos e retornar correspondências existentes.

Neste tutorial, veremos como usá -lo e examinaremos também suas variantes: egrep e FGREP. Colocaremos esse trecho realmente famoso do livro “O Senhor dos Anéis” em um arquivo, e usaremos como alvo para nossos exemplos:

Três anéis para os elven-reis sob o céu, sete para os candidatos anãs em seus corredores de pedra, nove para homens mortais condenados a morrer, um pelo Lorde das Trevas em seu trono escuro na terra de Mordor, onde as sombras se encontram. Um anel para governar todos eles, um anel para encontrá -los, um anel para trazer todos eles, e na escuridão os ligam, na terra de Mordor, onde as sombras se encontram. 

O arquivo será chamado LOTR.TXT.

Variantes de Grep

Na introdução, conversamos sobre duas variantes de grep: egrep e FGREP. Essas variantes são realmente depreciadas, pois são equivalentes a correr grep com o -E e -F opções respectivamente. Antes de começarmos a explicar o que essas variantes são diferentes do original, devemos examinar o comportamento do grep padrão ao usar expressões regulares.

O modo básico de expressão regular

Uma expressão regular é um padrão construído seguindo regras específicas para combinar com uma string ou várias strings. Por padrão, Grep usa o que chama Bre ou expressões regulares básicas: neste modo, apenas alguns meta-caracteres (caracteres com um significado especial dentro de uma expressão regular) estão disponíveis.

Como primeiro exemplo, tentaremos usar o grep para combinar com uma corda muito simples, a palavra "mortal". A sintaxe de Grep é muito simples: invocamos o programa que fornece o padrão a ser correspondido como o primeiro argumento e o arquivo de destino como o segundo:

$ grep mortal lotr.TXT


O comando acima não retorna correspondências, embora a palavra "mortal" apareça no texto: isso ocorre porque, por padrão, Grep executa uma pesquisa em maiúsculas e minúsculas modo, então, como a palavra "mortal" é capitalizada, ela não corresponde ao padrão que fornecemos. Para superar esse problema e executar uma pesquisa mais "genérica", podemos usar o -eu opção (abreviação de --ignorar caso, O que faz com que Grep ignore as distinções de casos:

$ grep -i mortal lotr.TXT

Desta vez, o comando produz a seguinte saída (a correspondência real é destacada em vermelho):

Nove para homens mortais condenados a morrer,

Uma coisa importante a perceber é que, por padrão, Grep retorna toda a linha na qual a partida é encontrada. Esse comportamento, no entanto, pode ser modificado usando o -o opção, ou sua versão longa --apenas correspondendo. Ao usar esta opção, apenas a partida em si é impressa:

$ grep -o -i mortal lotr.txt mortal 

Outra mudança interessante que podemos usar é -n, abreviatura de --número da linha. Quando esta opção é usada, o número de linhas em que uma correspondência é encontrada é incluída na saída Grep. Este comando:

$ grep -n -i mortal lotr.TXT

Produz a seguinte saída:

3: nove para homens mortais condenados a morrer

Onde 3 é o número da linha em que a partida é encontrada.

E se queremos apenas obter o número real de correspondências encontradas, em vez das próprias partidas? Grep tem uma opção dedicada para obter este resultado: -c, ou --contar. Usando o comando acima com esta opção retorna a seguinte saída:

1

O que é, como esperado, o número de correspondências encontradas no texto.

Meta-caracteres básicos

É hora de realizar uma pesquisa um pouco mais elaborada. Agora queremos encontrar todas as linhas começando com a letra "O". Mesmo ao trabalhar com expressões regulares básicas, podemos usar o ^ Personagem para combinar com a corda vazia no início de uma linha:



$ grep -i ^o lotr.TXT

Como esperado, o resultado do comando é:

Um para o Lorde das Trevas em seu trono escuro Um anel para governar todos eles, um anel para encontrá -los, um anel para trazer todos eles, e na escuridão os prendem, 

Isso foi muito fácil. Agora, vamos supor que queremos restringir ainda mais nossa pesquisa e encontrar todas as linhas começando com um "o" e terminando com um "", personagem. Podemos usar este exemplo para introduzir alguns outros meta-caracteres que podemos usar no modo REGEX básico:

$ grep -i ^o.*, $ lotr.TXT

O comando Linux acima retorna exatamente o que estávamos procurando:

 Um anel para governar todos eles, um anel para encontrá -los, um anel para trazer todos eles, e na escuridão os prendem,  

Vamos explicar o que fizemos acima. Primeiro de tudo, usamos o -eu opção para tornar nossa pesquisa insensível ao caso, assim como fizemos nos exemplos anteriores, do que usamos o ^ meta-caractere, seguido de um "O", procurando por linhas começando com esta carta.

Nós do que usamos dois novos Meta-caracteres: . e *. Qual é o seu papel na expressão regular? O . corresponde a qualquer caractere, enquanto o * é um operador de repetição, que corresponde ao elemento anterior zero ou mais vezes. Finalmente especificamos o ,, uma vírgula, a ser combinada literalmente como o último personagem antes do final da linha, combinou -se pelo $ meta-caractere.

Combinando um conjunto de personagens com colchetes

No exemplo acima, usamos o ponto, ., Para especificar um padrão que corresponda a cada personagem. E se quiséssemos combinar apenas um subconjunto de personagens? Digamos, por exemplo, queríamos encontrar todas as linhas começando com um "O" ou um "I": para obter esse resultado, podemos incluir o conjunto de personagens possíveis a serem correspondidos entre colchetes:

$ grep -i ^[o, i] lotr.TXT

O comando realizará uma pesquisa insensível a minúsculas por um "o" ou um "eu" localizado no início de uma linha. Aqui está o resultado:

Um para o Lorde das Trevas em seu trono escuro na terra de Mordor, onde as sombras estão. Um anel para governar todos eles, um anel para encontrá -los, um anel para trazer todos eles, e na escuridão os ligam, na terra de Mordor, onde as sombras se encontram. 


Para que o padrão seja correspondente, como está acima, pelo menos um dos caracteres contidos com colchetes deve ser encontrado. Ao especificar caracteres dentro de suportes quadrados, podemos especificar também um faixa usando o - personagem. Então, por exemplo, para combinar dígitos, podemos escrever [0-9]. De volta ao nosso texto, podemos usar essa sintaxe para combinar com as linhas que começam com cartas de "i" a "s" (insensível ao caso):

$ grep -i ^[i -s] lotr.TXT

A saída do comando:

Sete para os candidatos anões em seus corredores de pedra, nove para homens mortais condenados a morrer, um para o Lorde das Trevas em seu trono sombrio na terra de Mordor, onde as sombras se encontram. Um anel para governar todos eles, um anel para encontrá -los, um anel para trazer todos eles, e na escuridão os ligam, na terra de Mordor, onde as sombras se encontram. 

O exposto acima é quase o texto inteiro do poema: apenas a primeira linha, que começa com a letra "T" (não incluída no intervalo que especificamos), foi excluída da partida.

Dentro de colchetes, podemos combinar também classes específicas de caracteres, usando predefinidos Expressões de suporte. Alguns exemplos são:

  • [: Alnum:] - caracteres alfanuméricos
  • [: Digit:] - dígitos de 0 a 9
  • [: inferior:] - letras minúsculas
  • [: Upper:] - Letras superiores
  • [: em branco:] - Espaços e guias

O acima não é uma lista completa, mas você pode encontrar facilmente mais exemplos de expressões de suporte consultor o manual do grep.

Invertendo o resultado de uma partida

Nos exemplos acima, pesquisamos todas as linhas começando com um "O" ou um "I", usando uma pesquisa insensível ao caso. E se quiséssemos obter a saída oposta e, portanto, encontrar apenas linhas sem correspondências?

Grep nos permite obter este resultado usando o -v opção (abreviação de --Inverter-se-match). A opção, como sugerido, instrui Grep a devolver a partida invertida. Se executarmos o último comando que usamos acima, fornecendo esta opção, devemos obter apenas a primeira linha do poema como saída. Vamos verificar:

$ grep -i -v ^[i -s] lotr.TXT

O resultado é exatamente como esperávamos, apenas a primeira linha do poema:

Três anéis para os elven-kings sob o céu,

Em nosso exemplo, podemos obter o mesmo resultado prefixando a lista de caracteres entre colchetes com o ^ o caráter, que nesse contexto assume um significado diferente, fazendo com que o padrão corresponda apenas aos caracteres não contidos na lista. Se corrermos:

$ grep -i ^[ ^i -s] lotr.TXT

Recebemos a mesma saída de antes:

Três anéis para os elven-kings sob o céu,

Modo de expressão estendida

Usando egrep ou grep com o -E Opção (a última é a maneira recomendada), podemos acessar outros meta-caracteres a serem usados ​​em expressões regulares. Vamos vê -los.



Operadores de repetições avançadas

Nós já conhecemos o * Operador de repetição, que está disponível também no modo básico de expressão regular. Ao usar expressões estendidas, temos acesso a outros operadores desse tipo:

  • ? - corresponde ao item que o precede um ou zero vezes
  • + - corresponde ao elemento anterior uma ou mais vezes

Também podemos especificar repetições mais granulares usando a sintaxe do BRACES CURLY. Por exemplo, o padrão a seguir corresponde a cada ocorrência de um duplo "L":

grep l 2 lort.TXT

A saída do comando acima é:

Sete para os senhoras anões em seus corredores de pedra, um anel para governar todos eles, um anel para encontrá-los, um anel para trazer todos eles, e na escuridão os prendem, 

Com a mesma sintaxe, podemos especificar um número mínimo de ocorrências, usando x,, ou um alcance possível, usando x, y, onde x e y representam, respectivamente, o número mínimo e o máximo de repetições do item anterior.

Alternância

Ao trabalhar com expressões regulares estendidas, também temos acesso ao | meta-caractere, também chamado inflir operador. Ao usá -lo, podemos ingressar em duas expressões regulares, produzindo uma expressão que corresponderá a qualquer string correspondente a expressões alternativas.

É importante perceber que ambos os lados do inflir O operador sempre tentará ser comparado: isso significa que esse operador não funciona como o condicional ou Operador, onde o lado direito é avaliado apenas se o lado esquerdo for falso: isso pode ser verificado observando a saída do seguinte comando:

$ grep -n -e '^o | l 2' lotr.TXT 2: sete para os senhoras anões em seus corredores de pedra, 4: um para o Lorde das Trevas em seu trono escuro 6: um anel para governar todos eles, um anel para encontrá-los, 7: um anel para trazer todos eles, E na escuridão os ligam, 

Observe a saída: cada linha começando com capital "o" ou contendo um duplo "l" foi incluído na saída. Nas linhas 6 e 7, No entanto, ambas as expressões no lado esquerdo e direito do inflir O operador produziu uma partida. Isso, como afirmado acima significa que os dois lados do operador são avaliados e, se ambos produzirem uma partida, ambas as correspondências são incluídas.

FGREP

Se, por padrão, o Grep suportar operadores básicos de expressões regulares e usando o -E opção ou egrep Podemos usar expressões regulares estendidas, com o -F Switch (abreviação de cordas -fixadas) ou FGREP, Podemos instruir o programa a sempre interpretar um padrão como uma lista de seqüências fixas.

Isso significa que as cordas sempre são tentadas para serem literalmente, e todos os meta-caracteres perdem seu significado especial. Isso pode ser útil ao operar em um texto ou uma string que contém muitos caracteres que podem ser considerados operadores sem ter que escapar deles manualmente.

Pensamentos finais

Neste tutorial, aprendemos a conhecer o grep comando unix. Vimos como podemos usá -lo para encontrar correspondências em um texto usando expressões regulares e também examinamos o comportamento de suas variantes: egrep e FGREP. Examinamos algumas opções muito úteis, como -eu, que pode ser usado para fazer pesquisas insensíveis ao caso.

Finalmente, fizemos um tour por alguns dos operadores de expressões regulares mais usados. Grep é definitivamente uma das ferramentas de sistema mais importantes e tem uma documentação muito exaustiva: consultoria é sempre uma boa ideia!

Tutoriais do Linux relacionados:

  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Bash Regex avançado com exemplos
  • Mastering Bash Script Loops
  • Coisas para instalar no Ubuntu 20.04
  • Loops aninhados em scripts de basquete
  • Expressões regulares do Python com exemplos
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Bash regexps para iniciantes com exemplos
  • Tutorial de depuração do GDB para iniciantes
  • Manipulação de big data para diversão e lucro Parte 3