linux - 无法覆盖到文件

标签 linux bash unix sh

我正在尝试将 unix 命令的输出覆盖到文件,但它一直将输出附加到文件。

wget --progress=dot http://test.com/example.zip 2>&1 | grep --line-buffered "%" | \ 
 sed -u -e "s,\.,,g" | awk '{printf(" %4s", $2)}' > log.txt

可在此处找到引用资料:Tutorial

这是我得到的输出 - log.txt

   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   0%   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%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   1%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   2%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%   3%  

应该只有百分之一

10%

我哪里做错了?

最佳答案

使用三种工具(grepsedawk)来实现其中任何一种工具的功能,这表明编写原始脚本并不真正理解这些工具中的任何一个。

仅使用 awk(并且仅使用 posix awk 功能,afaik):

wget --progress=dot http://test.com/example.zip 2>&1 |
awk 'match($0,/[0-9]{1,3}%/){printf "%4s",substr($0,RSTART,RLENGTH) >"log.txt";
                             close("log.txt")}'

(我刚刚用 gawk、mawk 和 original-awk(在 Mac OS X 上使用)检查了这个,最后一个似乎不理解大括号重复运算符,所以你需要编写 match($0,/[0-9]?[0-9]?[0-9]%/)。使用 gawk,有一些可能的简化。)

这是一个仅使用 grep 的简单解决方案,尽管它的行为几乎与您的原始行为完全相同(即,它不会在每一行上倒回文件。我们会谈到这一点。)

wget --progress=dot http://test.com/example.zip 2>&1 |
  grep --line-buffered -oE '[0-9]{1,3}%'

有多种方法可以覆盖每一行的文件;这是一个简单的:

for PCT in $(wget --progress=dot http://test.com/example.zip 2>&1 |
             grep --line-buffered -oE '[0-9]{1,3}%'); do
  printf '%4s\n' $PCT > log.txt
done

关于linux - 无法覆盖到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936209/

相关文章:

linux - 纳米编辑器换行符

linux - 保存 zsh 的目录特定历史记录

php - 共享主机中的安全性

regex - 为什么我无法在正则表达式中将某些字符串与 ( | ) 匹配

mysql - 为什么我找不到 my.cnf?

linux - 不小心做了 chown -R my.user :staff/usr in OS X

linux - com.jcraft.jsch.JSchException : session is down 错误

bash - unix:根据列值合并文件

swift - Linux 导出路径错误替换

c - 用 C 编写自己的 shell,如何运行 Unix 可执行文件?