做时:
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}
01, 02, 03 而不是 1, 2, 3?
答案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 shell 中,使用
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
命令看起来更好,但会给出太大的数字如果日期字符串在一行中出现多次。