Linux - File Globbing x REGEX
.
REGEX = Regular Expression (expressão regular)
.
File Globbing = Uma forma que o bash (shell) tem de selecionar arquivos de diretórios na interface. Usa caracteres especiais, o asterisco, as chaves, colchetes, interrogação para ajudar o usuário a selecionar os arquivos e diretórios que desejar.
.
O REGEX vai usar o mesmos caracteres mas se forma diferente, com intenção diferente. A intenção é selecionar um "PADRÃO DE TEXTO".
.
FILE GLOBBING = SELECIONAR OS ARQUIVOS E DIRETÓRIOS
.
REGEX = SELECIONAR UM "PADRÃO DE TEXTO" DESEJADO
.
EXEMPLO FILE GLOBBING (Executo):
.
0)
mkdir -v test ; cd test/ ; touch NOME-DO-ARQ.txt nome-do-arquivo1.txt nome-do-arquivo2.txt NOME-DO-ARQUIVO1.txt NOME-DO-ARQUIVO2.txt Arquivo11.txt Arquivo12.txt ARQUIVO11.txt ARQUIVO12.txt arquivo1.txt arquivo2.txt arquivo3.txt arquivo4.txt arquivo5.txt Arquivo5.txt Arquivo1.txt Arquivo4.txt Arquivo3.txt Arquivo10.txt Arquivo9.txt Arquivo11.txt
1)
ls nome-do-arquivo*
2)
ls -l NOME-DO-ARQUIVO*
3)
ls -lit nome-do-arquivo1*
4)
ls -latr Arquivo[12345].txt
5)
ls -la arquivo[1-5].txt
6)
ls -l Arquivo* [Aa][12]
7)
ls -la Arquivo *[12]
8)
ls -la {Arquivo,arquivo}[12].txt
9)
ls -l *11.txt
10)
ls -l {Arquivo,ARQUIVO}11.txt
11)
ls -l {Arquivo,ARQUIVO}3.txt
12)
ls -l Arquivo1*
13)
ls -l Arquivo1?
14)
ls -l Arquivo?.txt
15)
ls -l Arquivo??.txt
.
EXEMPLO Expressão Regular (Executo):
Expressões regulares são criadas a partir de metacaracteres. Sendo eles:
--------------------
\ . * + - { } [ ] ^ $ | ? ( ) : ! = \b | \1
--------------------
Metacaracteres podem, dependendo do caso, ter mais de um significado de acordo com o contexto.
--------------------
Aspa " não é metacaractere.
--------------------
Para criar comandos usando expressões regulares, posso usar um arquivo de texto. O arquivo de texto serve para eu aprender a criar comandos usando expressões regulares. Posso criar comandos usando expressões regulares imaginando também.
--------------------
Se eu quero criar comandos usando expressões regulares preciso usar metacaracteres.
--------------------
Lista de metacaracteres para eu consultar:
--------------------
. ponto
[] lista
[^] lista negada
? opcional
* asterisco
+ mais
{} chaves
^ circunflexo
$ cifrão
\b borda
\ escape
| ou
() grupo
\1 retrovisor
--------------------
Os metacaracteres e suas funções estão divididos em quatro grupos distintos:
--------------------
1) Representantes
2) Quantificadores
3) Âncoras
4) Outros
--------------------
--------------------
1) Representantes
--------------------
--------------------
.
(ponto - um caractere qualquer)
Ex.:
cd
pwd
ls .
ls -li | grep ".ocumentos"
ls -li | grep ".odelos"
ls -li | grep "."
--------------------
[...]
(lista - lista de caracteres permitidos)
Ex.:
ls | grep [D]
(ls liste o que tiver D maiúsculo)
ls -t | grep [D-I]
--------------------
[^...]
(lista negada - lista de caracteres proibidos)
ls | grep [^D]
ls -t | grep [^D-I]
--------------------
--------------------
2) Quantificadores
--------------------
--------------------
?
(opcional - zero ou um)
Ex.:
ls -li | grep [M?]
ls -li | grep [D?]
--------------------
*
(asterisco - zero, um ou mais)
Ex.:
ls -li | grep [M*]
ls -li | grep [V*]
ls | grep -F '*.' *
--------------------
+
(mais - um ou mais)
Ex.:
ls -li | grep [M+]
ls -li | grep [V+]
--------------------
{n,m}
(chaves - de n até m)
ls -t | grep {D,}
ls -t | grep {M,}
--------------------
--------------------
3) Âncoras
--------------------
--------------------
^
(circunflexo - início da linha)
Ex.:
ls -t | grep {^D,}
--------------------
$
(cifrão - fim da linha)
Ex.:
ls -t | grep "$o"
--------------------
\b
(borda - início ou fim de palavra)
Ex.:
ls -li | grep [\bs]
ls -li | grep [\bV+]
--------------------
4) Outros
\c
(escape - torna literal o caractere c)
ls -li | grep [\c,M+]
ls -li | grep [\cV+]
--------------------
(...)
(ou - ou um ou outro)
ls -li | grep ...
ls -li | egrep 'Downloads|Modelos'
(ls liste exibindo ou Downloads ou Modelos)
--------------------
\1...\9
(retrovisor - texto casado nos grupos 1...9)
ls -li | grep \1...\9
--------------------
OBS:
Curingas usados em linha de comando, não são expressões regulares.
--------------------
Creio que a expressão regular abaixo é para validação de e-mails:
^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$
--------------------
Regex ------- Referências
[abc] ------- Um único caractere: a, b, OU c
[^abc] ------- Qualquer caractere exeto/menos: a, b, OU c
[a-z] ------- Qualquer caractere de a até z
[a-zA-Z] ------- Qualquer caractere de a-z OU A-Z
^ ------- Começo da linha
$ ------- Fim da linha
\A ------- Começo da string
\z ------- Fim da string
. ------- Qualquer caractere
\s ------- Qualquer espaço em branco
\S ------- Qualquer espaço não em branco
\d ------- Qualquer digito
\D ------- Qualquer não digito
\w ------- Qualquer palavra (letra, numero, underscore)
\W ------- Qualquer caractere que não seja palavra
\b ------- Borda
(...) ------- Captura o que estiver dentro. Pode conter outros grupos
(a|b) ------- a OU b
a? ------- Zero ou um a
a* ------- Zero ou mais a
a+ ------- Um ou mais a
a{3} ------- Exatamente 3 a
a{3,} ------- 3 ou mais a
a{3,6} ------- Ente 3 a 6 a
--------------------
Quem constrói uma casa com tijolos gratúitos e depois ganha dinheiro para si próprio de maneira ambiciosa e egoísta, é boa gente?
--------------------
Executo:
read -p "Informe um valor que será inserido em VAR1: " VAR1
read -p "Informe um valor que será inserido em VAR2: " VAR2
--------------------
OBS:
# $(expr $VAR1 + $VAR2) É uma substituição de comando que executa e joga o resultado na tela.
--------------------
Executo:
echo "A soma de $VAR1 + $VAR2 é $(expr $VAR1 + $VAR2)"
--------------------
Exemplos de scripts a serem executados:
--------------------
#!/bin/bash
# Nome do Script: 3Script-relatorio-da-maquina.sh
# Descrição:
# Execução: sh 3Script-relatorio-da-maquina.sh
# Autor: Fulano de Tal
# Data da Criação: DD/MM/YYYY
# Email: meu_mail@email.com
# Histórico de modificações:
# Comentário:
# COMENTÁRIOS ESPECIAIS:
# TODO - indica uma tarefa a ser feita
# FIXME - indica um bug conhecido que precisa ser arrumado
# XXX - Notícia, chama a atenção
#
# Primeiro definir as variáveis
# 8 Variáveis
KERNEL=$(uname -r)
HOSTNAME=$(hostname)
CPUNO=$(cat /proc/cpuinfo | grep "model name" | wc -l)
CPUMODEL=$(cat /proc/cpuinfo | grep "model name" |
head -n1 | cut -c14-)
# Acima cat /proc/cpuinfo mostra um monte de informação. Só quero uma linha de
# informação.
# Filtro usando pipe grep e o que tem no início da string "model name".
# Ainda aparecem 4 strings.
# Uso mais um pipe e o comando head -n1 aparece só uma
# linha. Mas...
# Uma parte desta única string não quero que apareça.
# Uso pipe e o comando cut -c14- para sumir com 14
# caracteres iniciais da
# string.
MEMTOTAL=$(free -h | grep 'Mem:' | cut -d: -f2)
MEMTOTAL2=$(expr $(cat /proc/meminfo | grep MemTotal | tr -d ' ' | cut -d: -f2 | tr -d kB) / 1024)
FILESYS=$(df -h | egrep -v '(tmpfs | udev)')
UPTIME=$(uptime -s)
# Noto que algumas variáveis são bem conhecidas
# mas outras são comandos criados a partir de
# expressões regulares.
# Para fazer um shell script funcionar criamos
# comandos via expressões regulares, colocamos
# eles dentro de variáveis. A variável só aceita
# um valor! Uma expressão regular é um só valor
# composto de quantos comandos a pessoa quiser.
# Este é o segredo da necessidade de aprender
# expressões regulares. Aprenda muito bem, para
# poder criar ótimos shell scripts.
clear
echo
echo '=============================='
echo "Relatório da Máquina: $HOSTNAME"
echo "Data/Hora: $(date)"
echo '=============================='
echo
echo "Ativa desde: $UPTIME"
echo
echo "Kernel: $KERNEL"
echo
echo "CPUs:"
echo "$CPUNO"
echo
echo "Modelo da(s) CPU(s): $CPUMODEL"
echo
echo "Memória Total: $MEMTOTAL"
echo
echo "$MEMTOTAL2"
echo
echo "Partições:"
echo
echo "$FILESYS"
echo
echo
echo 'Fim do Script'
echo
echo
# Fim do Script
-----------------
Aperto a tecla Esc digito :wq
-----------------
Executo:
-----------------
sh 3Script-relatorio-da-maquina.sh
-----------------
OUTRO SHELL SCRIPT ESCRITO DIFERENTE MAS SOBRE O MESMO ASSUNTO:
-----------------
#!/bin/bash
# Nome do Script: RelatInfo.sh
# Descrição: Script que gera um relatório de algumas informações da máquina atual
# Execução: ./RelatInfo.sh
# Autor: Fulana de Tal
# Data da Criação: DD/MM/YYYY
# Email: meu_mail1@mail.com
# Histórico de modificações:
# Comentário:
# COMENTÁRIOS ESPECIAIS:
# TODO - indica uma tarefa a ser feita - Info Sist
# FIXME - indica um bug conhecido que precisa ser arrumado - strings duplicadas, uso de variáveis
# XXX - Notícia, chama a atenção. Para remover linhas duplicadas em uma expressão regular:
# Procuro por: find and remove duplicate strings via unix shell script
# awk '!_[$1]++' nome_do_arquivo.txt (a expressão _[$1]++ incrementa o valor do elemento de array com index $1 por um desde que ++ venha depois)
echo ""
echo "== Relatório de Informações da Máquina =="
echo ""
echo 'Dia:'
date
echo ""
echo 'Nome da Máquina:'
hostname
echo ""
echo 'Máquina Ativa desde:'
uptime -s
echo ""
echo
echo 'Versão Distro:'
cat /proc/version
echo
echo 'Usuario:'
whoami
echo
echo 'Versão do Kernel:'
uname -r
echo ""
lscpu | grep 'CPU(s):'
echo ""
lscpu | grep 'Nome do modelo:'
echo ""
echo 'Partições:'
df -kh
echo ""
lscpu | grep 'Arquitetura:'
echo ""
lscpu | grep 'Modo(s) operacional da CPU:'
echo ""
echo 'Relatório de BUGS (nCPUs):' ; cat /proc/cpuinfo | grep 'bugs' | awk '!_[$1]++'
echo ""
echo 'Identidade do vendedor:'
cat /proc/cpuinfo | grep 'vendor_id' | head -n1 | cut -c12-
echo ""
echo 'Memória total (MB):'
expr $(cat /proc/meminfo | grep MemTotal | tr -d ' ' | cut -d: -f2 | tr -d kB) / 1024
echo
echo 'Fim do Script'
echo ""
# Fim do Script
--------------------------