Cadeia de correção de correspondência de regex no nome do host

0

Eu tenho o nome do host como segue

www-foo-1001-1-1.example.com

Estou escrevendo um script para o qual deve implantar o aplicativo que tenha a seguinte correspondência de seqüência de caracteres 1001-<any digit>-<any digit>

Exemplo: o script deve corresponder ao nome do host a seguir.

www-foo-1001-1-49
www-foo-1001-4-37
www-foo-1001-2-12
www-foo-1001-8-4

Ignore este padrão no nome do host.

www-foo-1001-1-2-49
www-foo-1001-1-1-49
www-foo-1001-1
www-foo-1001

tem que corresponder a este padrão 1001-N-N e ignorar qualquer outra coisa.

Mais detalhes que eu quero fazer if then.. e retornar exit código de status com $? para lançar erros que não estão combinando com o hostname padrão.

    
por Satish 12.09.2018 / 16:43

3 respostas

2

bash padrões estendidos estão ativados em [[ ... ]] ; então você pode fazer

hosts=( www-foo-1001-1-49 www-foo-1001-4-37 www-foo-1001-2-12 www-foo-1001-8-4 www-foo-1001-1-2-49 www-foo-1001-1-1-49 www-foo-1001-1 www-foo-1001 )
pattern='*-1001-+([[:digit:]])-+([[:digit:]])'
for h in "${hosts[@]}"; do
    if [[ $h == $pattern ]]; then
        echo "OK: $h"
    else
        echo "no: $h"
    fi
done
OK: www-foo-1001-1-49
OK: www-foo-1001-4-37
OK: www-foo-1001-2-12
OK: www-foo-1001-8-4
no: www-foo-1001-1-2-49
no: www-foo-1001-1-1-49
no: www-foo-1001-1
no: www-foo-1001

Meu padrão começa com *-1001- , no qual suponho que você não queira corresponder a 11001 ou 21001 etc.

O operador == em [[ ... ]] é um operador de correspondência de padrões.

O operando à direita é a variável de padrão, mas sem aspas . Isso permite a interpretação do valor da variável como um padrão não uma string .

    
por 12.09.2018 / 17:03
2

Usando o bash:

$ touch www-foo-1001  www-foo-1001-1  www-foo-1001-1-1-49  www-foo-1001-1-2-49  www-foo-1001-1-49  www-foo-1001-2-12  www-foo-1001-4-37  www-foo-1001-8-4
$ for f in *
do
  [[ $f =~ 1001-[[:digit:]]+-[[:digit:]]+$ ]] && printf 'Yes: %s\n' "$f"
done
Yes: www-foo-1001-1-49
Yes: www-foo-1001-2-12
Yes: www-foo-1001-4-37
Yes: www-foo-1001-8-4

Isso usa o operador condicional da expressão regular de bash para testar o argumento em relação a:

  • contém 1001-
  • seguido por algum número de dígitos
  • seguido por um -
  • seguido por algum número de dígitos
  • seguido por mais nada: $
por 12.09.2018 / 16:54
0
kapu@ppc:$ ls
www-foo-1001        www-foo-1001-1-1-49 www-foo-1001-1-49   www-foo-1001-4-37
www-foo-1001-1      www-foo-1001-1-2-49 www-foo-1001-2-12   www-foo-1001-8-4
kapu@ppc:$ ls | awk '/www-foo-1001-[0-9]+-[0-9]+$/{print}'
www-foo-1001-1-49
www-foo-1001-2-12
www-foo-1001-4-37
www-foo-1001-8-4
    
por 12.09.2018 / 20:14