Bash

如何在 {}(大括號擴展)中獲得 0 填充的數字?

  • November 14, 2021

我正在嘗試編寫一個簡單的腳本來從主機列表中檢索記憶體和交換使用情況。目前,我能夠實現這一目標的唯一方法是編寫 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 開始,所以我需要for為每組(001-009、010-099、100-218)做一個不同的循環. 有沒有一種方法可以讓我在一個腳本中執行此操作,而不是將 3 個腳本連接在一起?

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. 你呼叫 free 兩次,使用 grep 然後 awk:
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}'
  1. 此外,內部命令可以減少到這個值:
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";

引用自:https://unix.stackexchange.com/questions/335013