如何使用大括号扩展获得零填充数字? {1..30} 与 01 02 03 等

如何使用大括号扩展获得零填充数字? {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}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命令看起来更好,但会给出太大的数字如果日期字符串在一行中出现多次。

相关内容