\ r \ n不在awk的printf中工作?

时间:2011-07-17 18:10:01

标签: bash awk printf

通过谷歌搜索发现这个脚本,它有一个cp的进度条,问题是它创建了大量的行,如下所示:

  

0%[=>
  0%[=>
  0%[=>
  0%[=>
  0%[=>
  0%[=>
  0%[=>
  0%[=>
  0%[=>
  0%[=>
  0%[=>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>
  1%[==>

这是脚本的代码:

#!/bin/bash

   strace -q -ewrite cp --  `printf '%q ' $@` 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0

还有一件事,======的行太长了。就像,当他们走向90年代时,====的溢出会延伸到下一行。我怎么能编辑它所以它会打印75 因为我的默认终端是80宽。

编辑:好的我意识到,如果文件中有空格,这将无效。 [它只是没有做任何事情,并在我输入命令后立即退出]。有什么想法吗?

谢谢。 :)

2 个答案:

答案 0 :(得分:2)

在'printf'] \ r“:

之前取出printf " "
#!/bin/bash

strace -q -ewrite cp --  `printf '%q ' $@` 2>&1 \
  | awk '{
    count += $NF
        if (count % 10 == 0) {
           percent = count / total_size * 100
           printf "%3d%% [", percent
           for (i=0;i<=percent;i++)
              printf "="
           printf ">"
           for (i=percent;i<100;i++)
              printf "]\r"
        }
     }
     END { print "" }' total_size=$(stat -c '%s' "${1}") count=0

此外,您的终端窗口必须足够宽以处理所有字符(110个字符或更多)。

答案 1 :(得分:2)

如果您的百分比从未减少,则不需要第二个for循环(通过打印空格来清除行的其余部分)。

这些空间是否有机会将光标推进到下一行,而\r只是将光标放在该新行的第一列?

您可以通过确保终端宽度为&gt;来测试100个字符。

感谢Random832:

缩短界限:

if (count % 10 == 0) {
       percent = count / total_size * 100
       printf "%3d%% [", percent
       # Limit the line length to 40 chars
       width = percent * 40 / 100
       for (i=0;i<=width;i++)
          printf "="
       printf ">]\r"
    }