做的时候:
for i in {1..30}; do echo $i; grep $i/Aug access.log | sort -u | wc -l; done;
Run Code Online (Sandbox Code Playgroud)
问题是它是这样的:
1/Aug # should be 01/Aug
2/Aug # should be 02/Aug
...
Run Code Online (Sandbox Code Playgroud)
如何for i in {1..30}
给 01、02、03 而不是 1、2、3?
Kus*_*nda 21
在bash
和 中zsh
,使用{01..30}
:
$ for i in {01..30}; do
echo $i
# other code using "$i"
done
01
02
03
04
05
06
(etc.)
Run Code Online (Sandbox Code Playgroud)
在ksh93
,使用{0..30%02d}
。
在sh
或任何其他 POSIX shell 中,使用
i=0
while [ "$(( i += 1 ))" -le 30 ]; do
zi=$( printf '%02d' "$i" )
echo "$zi"
# other code using "$zi"
done
Run Code Online (Sandbox Code Playgroud)
您的变量i
还需要引用:
for i in {01..30}; do
echo "$i"
grep "$i/Aug" access.log | sort -u | wc -l
done
Run Code Online (Sandbox Code Playgroud)
或者,或者,
sed -E -n 's#^.*([0-9][0-9]/Aug).*$#\1#p' access.log | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
或者
grep -o '[0-9][0-9]/Aug' access.log | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
这个单一的管道(无循环)将输出匹配的日期2-digit-number/Aug
和匹配该日期字符串的访问日志条目的数量。
它通过[0-9][0-9]/Aug
从文件中提取所有出现的情况,对它们进行排序并uniq
计算每个出现的次数来做到这一点。
这种grep
变化虽然可以说比sed
命令更好看,但如果日期字符串在一行上出现多次,则会给出太大的数字。