중괄호 확장을 사용하여 0으로 채워진 숫자를 얻는 방법은 무엇입니까? {1..30} 및 01 02 03 등[복제]

중괄호 확장을 사용하여 0으로 채워진 숫자를 얻는 방법은 무엇입니까? {1..30} 및 01 02 03 등[복제]

할 때:

for i in {1..30}; do echo $i; grep $i/Aug access.log | sort -u | wc -l; done;

문제는 다음과 같이 진행된다는 것입니다.

1/Aug      # should be 01/Aug
2/Aug      # should be 02/Aug
...

for i in {1..30}1, 2, 3 대신 01, 02, 03을 제공하는 방법은 무엇입니까 ?

답변1

bash및 에서는 zsh다음을 사용합니다 {01..30}.

$ for i in {01..30}; do
      echo $i
      # other code using "$i"
  done
01
02
03
04
05
06
(etc.)

ksh93을(를) 사용하고 있습니다 {0..30%02d}.

sh또는 다른 POSIX 쉘 에서 다음을 사용하십시오.

i=0
while [ "$(( i += 1 ))" -le 30 ]; do
    zi=$( printf '%02d' "$i" )
    echo "$zi"
    # other code using "$zi"
done

변수 i도 따옴표로 묶어야 합니다.

for i in {01..30}; do
    echo "$i"
    grep "$i/Aug" access.log | sort -u | wc -l
done

또는,

sed -E -n 's#^.*([0-9][0-9]/Aug).*$#\1#p' access.log | sort | uniq -c

또는

grep -o '[0-9][0-9]/Aug' access.log | sort | uniq -c

이 단일 파이프라인(루핑 없음)은 일치하는 날짜 2-digit-number/Aug와 해당 날짜 문자열과 일치하는 액세스 로그 항목 수를 출력합니다.

[0-9][0-9]/Aug이는 파일에서 발생하는 모든 항목을 추출하여 정렬하고 각 발생 횟수를 계산하는 방식으로 uniq수행됩니다 .

grep변형은 sed명령보다 보기에는 더 좋아 보이지만 너무 큰 숫자를 제공합니다.만약에날짜 문자열은 한 줄에 여러 번 나타납니다.

관련 정보