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

Bas*_*asj 12 bash

做的时候:

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命令更好看,但如果日期字符串在一行上出现多次,则会给出太大的数字。

  • 此外,`seq -w 30` (3认同)
  • @αғsнιη 这是一个 XY 问题。真正的问题是访问日志中日期的解析。 (3认同)
  • 您可能还需要使用 `printf "%02d\n" {1..30}` 替代方案。 (2认同)