Linux grep e egrep expressões regulares teoria e prática? Hmm…

Expressões regulares – uma expressão regular é um padrão que descreve um conjunto de strings. Expressões regulares são construídas analogamente às expressões aritméticas, usando vários operadores para combinar expressões menores. O Grep entende duas versões diferentes da sintaxe da expressão regular: “básico” e “estendido”. No GNU grep, não há diferença na funcionalidade disponível usando a sintaxe. Em outras implementações, expressões regulares básicas são menos poderosas. A descrição a seguir se aplica a expressões regulares estendidas, usadas no egrep; as diferenças para expressões regulares básicas são resumidas posteriormente. Os blocos de construção fundamentais são as expressões regulares que correspondem a um único caractere. A maioria dos caracteres, incluindo todas as letras e dígitos, são expressões regulares correspondentes. Qualquer metacaractere com significado especial pode ser citado precedendo-o com uma barra invertida. Uma expressão entre colchetes é uma lista de caracteres entre [e]. Corresponde a qualquer caractere único nessa lista; se o primeiro caractere da lista for o sinal de intercalação ^, ele corresponderá a qualquer caractere que não esteja na lista. Por exemplo, a expressão regular [0123456789] corresponde a qualquer dígito único. Dentro de uma expressão entre colchetes, uma expressão de intervalo consiste em dois caracteres separados por um hífen (“-“). Corresponde a qualquer caractere único que classifique entre os dois caracteres, inclusive, usando a sequência de intercalação e o conjunto de caracteres da localidade. Por exemplo, no código de idioma C padrão, [a-d] é equivalente a [abcd]. Muitos códigos de idioma ordenam caracteres na ordem do dicionário e, nesses locais, [a-d] geralmente não é equivalente a [abcd]; pode ser equivalente a [aBbCcDd], por exemplo. Para obter a interpretação tradicional das expressões entre colchetes, você pode usar o código de idioma C configurando a variável de ambiente LC_ALL para o valor C. Por fim, determinadas classes de caracteres nomeadas são predefinidas nas expressões entre colchetes, da seguinte maneira. Seus nomes são auto-explicativos e são [: alnum:], [: alpha:], [: cntrl:], [: digit:], [: graph:], [: lower:], [: print:] , [: punct:], [: space:], [: upper:] e [: xdigit:]. Por exemplo, [[: alnum:]] significa [0-9A-Za-z], exceto que a última forma depende da localidade C e da codificação de caracteres ASCII, enquanto a anterior é independente da localidade e do conjunto de caracteres. (Observe que os colchetes nesses nomes de classe fazem parte dos nomes simbólicos e devem ser incluídos além dos colchetes que delimitam a lista de colchetes.) A maioria dos metacaracteres perde seu significado especial nas listas. Para incluir um literal], coloque-o primeiro na lista. Da mesma forma, para incluir um literal, coloque-o em qualquer lugar, exceto primeiro. Finalmente, para incluir um literal – coloque-o por último. O período . corresponde a qualquer caractere único. O símbolo w é sinônimo de [[: alnum:]] e W é sinônimo de [^ [: alnum]]. O sinal de intercalação ^ e o cifrão (“$”) são metacaracteres que correspondem respectivamente à sequência vazia no início e no final de uma linha. Os símbolos correspondem respectivamente à sequência vazia no início e no final de uma palavra. O símbolo b corresponde à sequência vazia na extremidade de uma palavra e B corresponde à sequência vazia, desde que não esteja na extremidade de uma palavra. Uma expressão regular pode ser seguida por um dos vários operadores de repetição:

Uma expressão regular pode ser seguida por um dos vários operadores de repetição:

? O item anterior é opcional e corresponde ao máximo uma vez.
* O item anterior corresponderá a zero ou mais vezes.
+ O item anterior será correspondido uma ou mais vezes.
{n} O item anterior corresponde exatamente n vezes.
{n,} O item anterior corresponde a n ou mais vezes.
{n, m} O item anterior corresponde a pelo menos n vezes, mas não mais que m vezes.

Duas expressões regulares podem ser concatenadas; a expressão regular resultante corresponde a qualquer sequência formada concatenando duas substrings que correspondem respectivamente às subexpressões concatenadas. Duas expressões regulares podem ser unidas pelo operador infix |; a expressão regular resultante corresponde a qualquer sequência que corresponda a qualquer subexpressão. A repetição tem precedência sobre a concatenação, que por sua vez tem precedência sobre a alternância. Uma subexpressão inteira pode ser colocada entre parênteses para substituir essas regras de precedência. A referência anterior n, onde n é um dígito único, corresponde à substring correspondida anteriormente pela n-ésima subexpressão entre parênteses da expressão regular. Nas expressões regulares básicas, os metacaracteres?, +, {, |, (, E) perdem seu significado especial; em vez disso, use as versões com barra invertida?, +, {, |, (, e). O egrep tradicional não suportava o {metacaractere, e algumas implementações do egrep suportam {em vez disso, portanto, os scripts portáteis devem evitar {nos padrões do egrep e devem usar [{] para corresponder a um literal {. O GNU egrep tenta dar suporte ao uso tradicional assumindo que {não é especial se for o início de uma especificação de intervalo inválida. Por exemplo, o comando shell egrep ‘{1’ pesquisa a cadeia de dois caracteres {1 em vez de relatar um erro de sintaxe na expressão regular. O POSIX.2 permite esse comportamento como uma extensão, mas os scripts portáteis devem evitá-lo. Variáveis de ambiente – O comportamento do Grep é afetado pelas seguintes variáveis de ambiente: Um código de idioma LC_foo é especificado examinando as três variáveis de ambiente LC_ALL, LC_foo, LANG, nessa ordem. A primeira dessas variáveis configuradas especifica o código do idioma. Por exemplo, se LC_ALL não estiver definido, mas LC_MESSAGES estiver definido como pt_BR, o português do Brasil será usado para o código de idioma LC_MESSAGES. O código de idioma C é usado se nenhuma dessas variáveis de ambiente estiver definida, ou se o catálogo de códigos de idioma não estiver instalado, ou se o grep não tiver sido compilado com o NLS (National Language Support). GREP_OPTIONS – Esta variável especifica opções padrão a serem colocadas na frente de qualquer opção explícita. Por exemplo, se GREP_OPTIONS for ‘- arquivos binários u003d sem correspondência – diretórios u003d ignorar’, grep se comportará como se as duas opções – arquivos binários u003d sem correspondência e – diretórios u003d ignor fossem especificadas antes de qualquer opções explícitas. As especificações das opções são separadas por espaços em branco. Uma barra invertida escapa ao próximo caractere, portanto, pode ser usada para especificar uma opção que contenha espaço em branco ou uma barra invertida. GREP_COLOR – especifica o marcador para realçar. LC_ALL, LC_COLLATE, LANG. Essas variáveis especificam o código de idioma LC_COLLATE, que determina a sequência de intercalação usada para interpretar expressões de intervalo como [a-z]. LC_ALL, LC_CTYPE, LANG – Essas variáveis u200bu200bespecificam a localidade LC_CTYPE, que determina o tipo de caracteres, por exemplo, quais caracteres estão em branco. LC_ALL, LC_MESSAGES, LANG – Essas variáveis especificam o código do idioma LC_MESSAGES, que determina o idioma que o grep usa para mensagens. A localidade C padrão usa mensagens em inglês americano. POSIXLY_CORRECT – Se definido, o grep se comporta conforme requer o POSIX.2; caso contrário, o grep se comportará mais como outros programas GNU. O POSIX.2 requer que as opções que seguem os nomes dos arquivos sejam tratadas como nomes de arquivo; por padrão, essas opções são permutadas para a frente da lista de operandos e são tratadas como opções. Além disso, o POSIX.2 exige que as opções não reconhecidas sejam diagnosticadas como “ilegais”, mas como elas não são realmente contrárias à lei, o padrão é diagnosticá-las como “inválidas”. POSIXLY_CORRECT também desativa _N_GNU_nonoption_argv_flags_, descrito abaixo. _N_GNU_nonoption_argv_flags_ (Aqui N é o ID numérico do processo do grep.) Se o i-ésimo caractere do valor dessa variável de ambiente for 1, não considere o i-ésimo operando do grep como uma opção, mesmo que pareça ser um. Um shell pode colocar essa variável no ambiente para cada comando executado, especificando quais operandos são os resultados da expansão de curinga do nome do arquivo e, portanto, não devem ser tratados como opções. Esse comportamento está disponível apenas na biblioteca GNU C e somente quando POSIXLY_CORRECT não está definido. Exemplos:

Procure padrões de ajuda de suporte e janelas no arquivo myfile.txt. Faça a correspondência de quaisquer linhas no myfile.txt que iniciem uma linha com uma palavra alfabética que também termine a linha. Faça a correspondência de quaisquer linhas no myfile.txt que iniciem uma linha com uma palavra alfabética que também termine a linha.

Crio um diretório e um arquivo para testes.

1) mkdir -pv ~/TESTES/TESTES_grep

2) cd ~/TESTES/TESTES_grep

3) touch myfile.txt

4) echo -e “support\nhelp \n58 \n01 ball \n10 hands \n99 \nwindows \nbegin \nLinux \nend \nUnix \nSupport \nEnd \nfight \nHelp \nJoe \njone \n1 Fight \n8 Windows \nZulu \n77 \nLIFE \n0 init \n9 conf \nAlpha\n” > myfile.txt

Com o diretório eo arquivo criados podemos testar alguns comandos nele:

egrep “support|help|windows” myfile.txt

Resultado:

~/TESTES/TESTES_grep:$ egrep “support|help|windows” myfile.txt
support
help
windows
~/TESTES/TESTES_grep:$

Também podemos especificar caracteres do alfabeto com [a-z] para caracteres em minúsculas e [A-Z] para caracteres em maiúsculas. Neste exemplo, corresponderemos caracteres maiúsculos.

egrep ‘^[a-zA-Z]+$’ myfile.txt

Resultado:

~/TESTES/TESTES_grep:$ egrep ‘^[a-zA-Z]+$’ myfile.txt
support
Alpha
~/TESTES/TESTES_grep:$

egrep -c ‘^begin|end$’ myfile.txt

Resultado:

~/TESTES/TESTES_grep:$ grep -c ‘^begin|end$’ myfile.txt
0

cat /etc/passwd/

egrep systemd /etc/passwd

Resultado:

~:$ egrep systemd /etc/passwd
systemd-resolve:x:988:988:systemd Resolver:/:/sbin/nologin
systemd-timesync:x:987:987:systemd Time Synchronization:/:/sbin/nologin
systemd-coredump:x:986:986:systemd Core Dumper:/:/sbin/nologin

Comandos:

egrep ‘[0-9]’ myfile.txt

Resultado:

~/TESTES/TESTES_grep:$ egrep ‘[0-9]’ myfile.txt
58
01 ball
10 hands
99
1 Fight
8 Windows
77
0 init
9 conf
~/TESTES/TESTES_grep:$

Executo os comandos abaixo:

egrep ‘[A-Z]’ myfile.txt

egrep ‘^[a-Z]’ myfile.txt

egrep ‘[0-9]$’ myfile.txt

egrep -i ‘alpha’ myfile.txt

Deixe um comentário