Utilizando "expr" para "String Matching" através de expressões regulares em shell
Este artigo tem por intuito mostrar mais uma técnica de "String Matching" em shell tirando proveito de RegEx através do comando "expr". Este comando é encontrado na maioria dos sistemas operacionais UNIX, o que facilita o desenvolvimento em plataformas sem ferramentas GNU instaladas. No Linux, o comando faz parte do pacote "coreutils".
Introdução
O comando expr é muito conhecido pelos programadores shell
(bash, ksh, sh, etc), mas a sua utilização, na maioria das vezes,
restringe-se ao comando abaixo:
contador=`expr $contador + 1`
Este comando irá incrementar o valor da variável contador em 1, outras formas de alcançar o mesmo objetivo em bash seriam:
let contador++
contador=$((contador+1))
contador=$(bc <<< "$contador + 1")
contador=$((contador+1))
contador=$(bc <<< "$contador + 1")
É verdade que existem várias outras maneiras de fazer, mas o foco deste documento é apresentar as funcionalidades do comando "expr", um poderoso processador de expressões.
Esse comando pode ser utilizado para processar expressões matemáticas através de operadores lógicos como |, >, >=, &, que representam o OU, E, MAIOR QUE, etc, assim como também pode utilizar operadores aritméticos, como visto no exemplo acima com o operador de adição ou +, outros possíveis seriam: % ou módulo, * ou multiplicação.
Abaixo veremos exemplos de expressões aritméticas utilizando alguns operadores, assim como os parênteses para agrupar e definir a ordem de execução dos comandos:
$ expr \( 30 + 2 \) \* \( 13 % 2 \) - \( 2 \* \( 20 - 8 \) \)
8
$ expr \( 30 + 2 \) \* \( 13 % 2 \) - \( 2 \* \( 20 - 8 \) \) / 2
20
$ expr \( \( 30 + 2 \) \* \( 13 % 2 \) - \( 2 \* \( 20 - 8 \) \) \) / 2
4
expr "Apr 26 09:27:01 localhost sshd[2549]: error: Address already in use." : '.*\[\([[:digit:]]\{1,\}\)\]'
O entendimento da mesma fica como dever de casa :P
[]'s,
Fábio