할 때:
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
명령보다 보기에는 더 좋아 보이지만 너무 큰 숫자를 제공합니다.만약에날짜 문자열은 한 줄에 여러 번 나타납니다.