如何通过管道传递或重定向curl -v的输出?


117

出于某种原因,无论我是通过2>还是>或|重定向输出,输出总是被打印到终端。有办法解决这个问题吗?为什么会这样呢?


3
如果我这样做curl -v url 2>&1,错误将被正确重定向到我的标准输出。
乔什·李

Answers:


134

添加-s(silent)选项以删除进度表,然后将stderr重定向到stdout以在与响应正文相同的fd上获取详细输出

curl -vs google.com 2>&1 | less

3
这适用于大多数网站,但是由于某些原因,即使我执行`2>&1 |,我的计算机上的本地服务器仍会打印完整输出。grep asdfasdfasdfasdfdfs`或类似的东西。包括标题的完整输出仍显示在控制台上。我还有其他流可以传送到grep中以提取所需的数据吗?
jonderry 2011年

您实际上是试图提取哪些信息,以及您想丢弃哪些信息。我理解您的问题意味着您希望将-v的所有输出定向到stdout。
SingleNegationElimination 2011年

我要处理一些cookie(基本上是从cookie中提取一些信息并做一些其他事情)。是的,我希望一切顺利进行,以便可以通过管道处理所需的任何内容。当前,某些输出仅显示在控制台上,似乎无法重定向,我不确定为什么。
jonderry 2011年

您可以张贴要捕获的屏幕上显示的输出的屏幕截图吗?我不知道您可能会看到什么样的输出2>&1
SingleNegationElimination

它与任何其他网站的输出类型相同。唯一的区别是服务器在本地运行。有什么方法可以将任何程序打印到控制台,但不会使stout / sterr捕获该文本?
桑德里

115

您的网址中可能包含与号。我也遇到了这个问题,我意识到我的URL充满了&符号(来自传递的CGI变量),因此所有内容都以一种怪异的方式发送到后台,因此无法正确重定向。如果在URL周围加上引号,它将对其进行修复。


1
我有同样的问题。不需要2>&1,因此我可以将输出和连接日志分开。谢谢roadnottaken。
Quornian 2012年

3
Love Stack-O ...我发现了这个q,并在URL中提到了&符号。它把引号放在我的周围,问题解决了。
Paulb 2014年

2
引号对我有用。我觉得curl正在其他线程中执行。非常感谢 !
vdolez 2015年

1
在保存我的夜晚之前,必须在网上搜索五分钟:)
Shautieh '16

耶稣,这是一个可怕的卷曲错误-至少它应该失败或发出警告。您在2012年提出的答案在2018年对我有帮助。花了30分钟解决了这个问题,直到我遇到您的答案。谢谢!
Mauvis Ledford

29

上面的答案对我没有用,最终的语法是:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

tee将输出显示在屏幕上,但也将其附加到我的日志中。


1
&> /dev/stdout绝对是缺少的部分,谢谢
mattspain 2015年

10

如果您需要文件中的输出,则可以使用重定向:

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

请确保不要翻转>curl-output.txtand 2>&1,由于bash的重定向行为,它不会起作用。


3

我发现了同样的事情:curl本身会打印到STDOUT,但无法通过管道传递到另一个程序中。

起初,我以为我已经通过使用xargs首先回显输出来解决了它:

curl -s ... <url> | xargs -0 echo | ...

但是然后,正如注释中指出的那样,它也可以在没有xargs部分的情况下工作,因此-s(静默模式)是防止将无关的进度输出到STDOUT的关键:

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

上面的示例<sometag>从curl语句的XML输出中获取简单内容(不包含嵌入式标签)。


2
在您的示例中,“ xargs -0 echo |” 是没有必要的。只要您具有“ curl -s”,就可以将输出传递到另一个程序。
Ryan Horrisberger

1

只是我的2美分。如前所述,下面的命令应该可以解决问题

curl -vs google.com 2>&1

但是,如果需要将输出保存到文件中,

curl -vs google.com > out.txt 2>&1

应该管用。


1
这不会为2011年接受的答案增加任何实际价值。如果有的话,这可能是对该答案的评论。
Trincot

0

以下为我工作:

将curl语句放入一个名为的脚本中 abc.sh

现在运行:

sh abc.sh 1>stdout_output 2>stderr_output

您将在中获得curl的结果,stdout_output并在中获得进度信息stderr_output


0

这个简单的示例显示了如何捕获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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.