如何管道或重定向 curl -v 的输出?
Posted
技术标签:
【中文标题】如何管道或重定向 curl -v 的输出?【英文标题】:How do I pipe or redirect the output of curl -v? 【发布时间】:2011-07-22 14:20:23 【问题描述】:由于某种原因,输出总是被打印到终端,无论我是通过 2> 或 > 还是 | 重定向它。有没有办法解决这个问题?为什么会这样?
【问题讨论】:
如果我这样做curl -v url 2>&1
,错误会正确地重定向到我的标准输出。
【参考方案1】:
添加-s
(静默)选项以删除进度表,然后将 stderr 重定向到 stdout 以获得与响应正文相同的 fd 上的详细输出
curl -vs google.com 2>&1 | less
【讨论】:
这适用于大多数网站,但由于某种原因,我机器上的本地服务器仍会打印完整的输出,即使我执行 ` 2>&1 | grep asdfasdfasdfasdfdfs` 或类似的东西。包括标题在内的完整输出仍显示在控制台上。我可以通过管道将其他一些流导入 grep 以提取我需要的一些数据吗? 您实际上想提取哪些信息,以及您想丢弃哪些信息。我理解您的问题意味着您希望 -v 的所有输出都定向到标准输出。 我想处理一些 cookie(基本上是从 cookie 中获取一些信息并做一些其他事情)。是的,我希望所有内容都输出到标准输出,因此我可以通过管道处理我想要的任何内容。目前一些输出只显示在控制台上,似乎无法重定向,我不知道为什么。 您能否发布您希望捕获的屏幕输出的屏幕截图?我不知道您可能会看到2>&1
可能会错过的哪种输出。
也可以使用--stderr -
curl 参数将stderr重定向到stdout。【参考方案2】:
您的网址中可能包含与号。我也遇到了这个问题,我意识到我的 URL 充满了与号(来自传递的 CGI 变量),因此所有内容都以一种奇怪的方式发送到后台,因此无法正确重定向。如果你在 URL 周围加上引号,它会修复它。
【讨论】:
我遇到了同样的问题。不需要 2>&1 所以我可以将输出和连接日志分开。谢谢 roadnottake。 Love Stack-O... 我发现了这个 q,并在 URL 中提到了与号。它在我的周围加上引号,问题就解决了。 引号对我有用。我觉得 curl 正在其他线程中执行。非常感谢! 不得不在网上搜索五分钟,然后才拯救了我的夜晚 :) @MauvisLedford 不是 curl 错误,而是 shell 的语法。如果不确定,请使用引号。【参考方案3】:我发现了同样的事情:curl 本身会打印到 STDOUT,但不能通过管道传输到另一个程序中。
起初,我以为我已经通过使用 xargs 先回显输出来解决它:
curl -s ... <url> | xargs -0 echo | ...
但是,正如 cmets 中所指出的,它也可以在没有 xargs 部分的情况下工作,因此-s
(静默模式)是防止无关进度输出到 STDOUT 的关键:
curl -s ... <url> | perl -ne 'print $1 if /<sometag>([^<]+)/'
上面的例子从 curl 语句的 XML 输出中抓取了简单的<sometag>
内容(不包含嵌入的标签)。
【讨论】:
在你的例子中'xargs -0 echo |'是不必要的。只要你有'curl -s',你就可以将输出传送到另一个程序。【参考方案4】:上面的答案对我不起作用,最终是这样的语法:
curl https://$URL &> /dev/stdout | tee -a $LOG
tee 将输出放在屏幕上,但也将其附加到我的日志中。
【讨论】:
&> /dev/stdout
绝对是缺少的部分,谢谢【参考方案5】:
以下内容对我有用:
将您的 curl 语句放入名为 abc.sh
的脚本中
现在运行:
sh abc.sh 1>stdout_output 2>stderr_output
您将在 stdout_output
中获得 curl 的结果,在 stderr_output
中获得进度信息。
【讨论】:
【参考方案6】:只有我的 2 美分。 如前所述,下面的命令应该可以解决问题
curl -vs google.com 2>&1
但是如果需要将输出保存到文件中,
curl -vs google.com > out.txt 2>&1
应该可以。
【讨论】:
这对 2011 年接受的答案没有任何实际价值。如果有的话,这可能是对该答案的评论。【参考方案7】:这个简单的例子展示了如何捕获 curl 输出,并在 bash 脚本中使用它
test.sh
function main
\curl -vs 'http://google.com' 2>&1
# note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file.
# capture output of curl to a variable
OUT=$(main)
# search output for something using grep.
echo
echo "$OUT" | grep 302
echo
echo "$OUT" | grep title
【讨论】:
【参考方案8】:如果您需要输出在文件中,您可以使用重定向:
curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1
请务必不要翻转>curl-output.txt
和2>&1
,因为bash's redirection behavior将不起作用。
【讨论】:
以上是关于如何管道或重定向 curl -v 的输出?的主要内容,如果未能解决你的问题,请参考以下文章