在 bash 脚本中使用 wget 中下载文件的数量作为变量

在 bash 脚本中使用 wget 中下载文件的数量作为变量

我可以获取已下载文件的数量并将wget -r其用作变量吗?我想编写一个脚本,在其中运行多个 wget 命令(使用 -q 以便我可以控制输出),然后在最后将已下载文件的数量加起来并将其回显给用户。这可能吗?

答案1

为了在 Jed 的建议基础上进一步完善它,你可以这样做:

MY_VARIABLE=$(wget -r http://foo 2>&1 | grep -c 'saved')

或者,如果你想要更复杂一点,但更可靠和稳健一点,你可以提取 wget 给出的摘要下载计数:

MY_VARIABLE=$(wget -r -nv http://foo 2>&1 | awk '/^Downloaded:/ {print $2}')

更新:关于2>&1构造,对于 *nix 应用程序,有两个默认输出流,stdout(文件描述符 1)和stderr(文件描述符 2)。对于交互式命令,两者通常都发送到屏幕/终端,因此很难区分它们。告诉2>&1您的 bash 获取发送到 (fd 2) 的输出stderr并将其与 (fd 1) 的输出相结合stdout。结果是单个输出流,它将查找管道中的下一个工具(如上所示),就像输出在屏幕上显示的那样。

这是必需的,因为 wget 默认将其状态信息发送到stderr,而不是stdout。如果您在不重定向的情况下运行上述程序stderr,则将发送stdout到管道程序,但仅此而已。您将看到 wget 的所有输出都发送到您的屏幕 ( stderr),并且变量将为空,因为grepawk语句正在处理stdout(没有输出)。

要查看应用程序发送到哪里的内容,您可以执行以下操作:

wget -r -nv http://foo 2>foo.err 1>foo.out

要不就:

wget -r -nv http://foo 2>foo.err >foo.out

如果您没有指定输出重定向的数字,则默认为stdout

文件foo.err和将分别包含您的命令以和foo.out结尾的内容。stderrstdout

另外值得注意的是,您还可以使用|&作为管道命令与 结合stderrstdout作为 的简写2>&1

stdin有关命令重定向和、stdout和的更多信息stderr,请参阅 bash 手册页、stdin、stdout 和 stderr 手册页,有关和的历史原因stdoutstderr请参阅此帖子:http://jstorimer.com/2011/12/29/the-difference-between-stdout-and-stderr.html

答案2

您可以简单地将所有输出定向到一个文件,并使用标志-a将输出发送到文件,然后 grep 日志文件并计算单词“saved”的出现次数:

root@demo:tmp# wget -r http://www.google.com/index.html -a logfile
root@demo:tmp# grep saved logfile |wc -l
1

相关内容