{}(中括弧拡張)でゼロで埋められた数字を取得するには?

{}(中括弧拡張)でゼロで埋められた数字を取得するには?

ホストリストからメモリとスワップ使用量を取得する簡単なスクリプトを作成しようとしています。現在これを達成する唯一の方法は、3つの別々のスクリプトを書くことです。

for a in {1..9}; do echo "bvrprdsve00$a; $(ssh -q bvrprdsve00$a "echo \$(free -m|grep Mem|/bin/awk '{print \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; 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 \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; 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 \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; done >> /tmp/svemem.txt

forこれは、ホスト名は常に3桁で終わり、ホストは001-218から始まるため、各グループ(001-009、010-099、100-218)ごとに異なるループを実行する必要があるためです。 3つのスクリプトを一緒にリンクするのではなく、1つのスクリプトでこれを行う方法はありますか?

答え1

Bash中括弧拡張は、前にゼロの数字を生成できます(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

したがって、次のようにすることができます。

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

しかし、コマンドの内部を少し見てみましょう。

  1. grepを使用してからawkを2回無料で呼び出します。

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

    これらはすべて、freeandへの単一の呼び出しに折りたたむことができますawk

    free -m|/bin/awk '/Mem|Swap/{print \$4}'
    
  2. また、内部コマンドを次の値に減らすこともできます。

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

その後、スクリプト全体は次のようになります。

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

答え2

printf '%04d' "$a"$a整数の場合、ゼロで埋められた4桁の文字列が出力されます。

例:

a=14
printf -v b '%04d' "$a"

printf '%s\n' "$b"

出力されます

0014

したがって、以前と同じように繰り返し、ゼロで埋められた変数を作成して使用してください。

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

上記の課題は、za次のこともできます。

printf -v za '%04d' "$a"   # print to variable za

Cプログラマが読みやすくする

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

残りのコードはまだ見ていません。

注:ksh拡張が常にゼロで埋まるように変数にプロパティを設定できます。

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

答え3

seq -w 1 218またはを使用してseq -f "%03g" 1 218番号を生成できます。

答え4

しかし、サポート拡張ゼロパディング方法があることがわかりました。パラメータ拡張既存の変数を変更するのに便利です。

digits=00000
num=123

# Option 1:
temp=$digits$num
echo ${temp:(-${#digits})}
# prints 00123

# Option 2:
echo ${digits:${#num}:${#digits}}${num}
# prints 00123

関連情報