Como obtenho números 0-padded em {} (expansão de contraventamento)?

0

Estou tentando escrever um script simples para recuperar mem e trocar o uso de uma lista de hosts. Atualmente, a única maneira de conseguir isso é escrever três scripts separados:

for a in {1..9}; do echo "bvrprdsve00$a; $(ssh -q bvrprdsve00$a "echo \$(free -m|grep Mem|/bin/awk '{print \}';free -m|grep Swap|/bin/awk '{print \}')")"; done > /tmp/svemem.txt;
for a in {10..99}; do echo "bvrprdsve0$a; $(ssh -q bvrprdsve0$a "echo \$(free -m|grep Mem|/bin/awk '{print \}';free -m|grep Swap|/bin/awk '{print \}')")"; done >> /tmp/svemem.txt;
for a in {100..218}; do echo "bvrprdsve$a; $(ssh -q bvrprdsve$a "echo \$(free -m|grep Mem|/bin/awk '{print \}';free -m|grep Swap|/bin/awk '{print \}')")"; done >> /tmp/svemem.txt

A razão para isto é que o nome do host sempre termina em um número de 3 dígitos e esses hosts vão de 001 a 218, então eu precisei fazer um loop diferente para cada conjunto (001-009, 010-099, 100 -218). Existe uma maneira em que eu possa fazer isso em um script em vez de juntar 3 juntos?

    
por Matthew Perrott 05.01.2017 / 11:14

3 respostas

4

As expansões da chave Bash podem gerar os números com zeros à esquerda ( desde o bash 4.0 alpha + ~ 2009-02-20 ):

$ echo {001..023}
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023

Então, você pode fazer:

for a in {001..218}; do  echo "bvrprdsve$a; $(ssh -q bvrprdsve$a "echo \$(free -m|grep Mem|/bin/awk '{print \}';free -m|grep Swap|/bin/awk '{print \}')")"; done >> /tmp/svemem.txt

Mas, vamos olhar dentro do comando um pouco:

  1. Você está chamando free duas vezes, usando grep e then awk:

    free -m|grep Mem |/bin/awk '{print \}';
    free -m|grep Swap|/bin/awk '{print \}'
    

    Tudo pode ser reduzido para esta chamada para free e awk :

    free -m|/bin/awk '/Mem|Swap/{print \}'
    
  2. Além disso, o comando interno pode ser reduzido para este valor:

    cmd="echo \$(free -m|/bin/awk '/Mem|Swap/{print \}')"
    

Então, todo o script ficará assim:

b=bvrprdsve;
f=/tmp/svemem.txt;
cmd="echo \$(free -m|/bin/awk '/Mem|Swap/{print \}')";
for a in {001..218}; do echo "$b$a; $(ssh -q "$b$a" "$cmd")"; done >> "$f";
    
por 05.01.2017 / 12:16
2

Você pode usar seq -w 1 218 ou seq -f "%03g" 1 218 para gerar seus números.

    
por 05.01.2017 / 11:24
1

printf '%04d' "$a" produzirá uma string de quatro dígitos preenchida com zero se $a for um inteiro.

Exemplo:

a=14
b="$( printf '%04d' "$a" )"

printf '%s\n' "$b"

irá produzir

0014

Então, faça um loop como antes e crie sua variável preenchida com zero e use-a:

for a in {1..9}; do
  za="$( printf '%04d' "$a" )"
  # rest of code, using $za
done

Ou, para ser mais legível para o programador C

for (( a = 1; a < 10; ++a )); do
  za="$( printf '%04d' "$a" )"
  # rest of code, using $za
done

Eu não olhei para o resto do código.

Nota: Em ksh , um pode definir um atributo em uma variável para que sua expansão seja sempre preenchida com zero:

typeset -Z4 za
for (( a = 1; a < 10; ++a )); do
  za="$a"
  printf "%s\n" "$za"
done

0001
0002
0003
0004
0005
0006
0007
0008
0009
    
por 05.01.2017 / 11:46