{}(중괄호 확장)에서 0으로 채워진 숫자를 얻는 방법은 무엇입니까?

{}(중괄호 확장)에서 0으로 채워진 숫자를 얻는 방법은 무엇입니까?

호스트 목록에서 메모리와 스왑 사용량을 검색하는 간단한 스크립트를 작성하려고 합니다. 현재 이를 달성할 수 있는 유일한 방법은 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

Bash 중괄호 확장은 앞에 0이 있는 숫자를 생성할 수 있습니다(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를 두 번 무료로 호출합니다.

    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정수인 경우 0으로 채워진 4자리 문자열이 출력됩니다.

예:

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

printf '%s\n' "$b"

출력됩니다

0014

따라서 이전처럼 반복하고 0으로 채워진 변수를 생성하여 사용하세요.

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확장이 항상 0으로 채워지도록 변수에 속성을 설정할 수 있습니다.

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

관련 정보