![중괄호 확장을 사용하여 0으로 채워진 숫자를 얻는 방법은 무엇입니까? {1..30} 및 01 02 03 등[복제]](https://linux55.com/image/118971/%EC%A4%91%EA%B4%84%ED%98%B8%20%ED%99%95%EC%9E%A5%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%200%EC%9C%BC%EB%A1%9C%20%EC%B1%84%EC%9B%8C%EC%A7%84%20%EC%88%AB%EC%9E%90%EB%A5%BC%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%7B1..30%7D%20%EB%B0%8F%2001%2002%2003%20%EB%93%B1%5B%EB%B3%B5%EC%A0%9C%5D.png)
할 때:
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
명령보다 보기에는 더 좋아 보이지만 너무 큰 숫자를 제공합니다.만약에날짜 문자열은 한 줄에 여러 번 나타납니다.