web-dev-qa-db-ja.com

{}(中かっこ展開)で0を埋め込んだ数値を取得するにはどうすればよいですか?

ホストのリストからmemとswapの使用状況を取得する簡単なスクリプトを書こうとしています。現在、これを実現できる唯一の方法は、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

この理由は、ホスト名は常に3桁の数字で終わり、これらのホストは001-218から始まるため、各セット(001-009、010-099、100-218)に対して異なるforループを実行する必要があったためです。 。 3つを結合する代わりに、1つのスクリプトでこれを行う方法はありますか?

5
Matthew Perrott

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を使用して2回freeを呼び出し、次にawkを呼び出します。

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

    すべてをfreeおよびawkへのこの1回の呼び出しに削減できます。

    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";
9
Isaac

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

例:

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

printf '%s\n' "$b"

出力されます

0014

したがって、前と同じようにループして、ゼロで満たされた変数を作成し、それを使用します。

for a in {1..9}; do
  za="$( printf '%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
  za="$( printf '%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
4
Kusalananda

seq -w 1 218またはseq -f "%03g" 1 218を使用して数値を生成します。

3
Fedor Dikarev