ホストリストからメモリとスワップ使用量を取得する簡単なスクリプトを作成しようとしています。現在これを達成する唯一の方法は、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
しかし、コマンドの内部を少し見てみましょう。
grepを使用してからawkを2回無料で呼び出します。
free -m|grep Mem |/bin/awk '{print \$4}'; free -m|grep Swap|/bin/awk '{print \$4}'
これらはすべて、
free
andへの単一の呼び出しに折りたたむことができますawk
。free -m|/bin/awk '/Mem|Swap/{print \$4}'
また、内部コマンドを次の値に減らすこともできます。
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";