打印 httpie 命令的输出,然后通过管道传输到 grep

打印 httpie 命令的输出,然后通过管道传输到 grep

如何打印 httpie 请求的输出,然后通过管道传输到 grep 以检查请求是否成功或失败?

http --print=hb POST http://localhost:8080 | grep -c "HTTP/1.1 200" && echo "succeeded" && exit 0 || echo "failed" && exit 1

我尝试将 xargs 与 http://localhost:8080 | xargs sh -c 'response=$1' sh | grep ...

但这没有用,任何想法

答案1

tee是用于在其他地方发送 stdin 副本的标准实用程序。 >()是一个将 stdin 传递到任意命令的 bash 构造。通常,我们只需输入“|”直接发送,但在我们想要发送未更改的 stdin 副本的情况下,此功能在这里有一些用途。

将它们组合起来,如下所示:

$ command1 | tee >( command2) | command3

command2command3看到同样的事情

对于您的用例,请尝试:

$ http --print=h http://www.google.com | tee >( grep -c "HTTP/1.1 200" >/dev/null && echo "succeeded" > /dev/stderr || echo "failed" > /dev/stderr) | sed 's/^/# /'
# HTTP/1.1 200 OK
# Date: Thu, 26 May 2022 00:32:29 GMT
... elided ...
# Set-Cookie: NID=511=CEilmSmMThJIS-KWlutGVDxrE; expires=Fri, 25-Nov-2022 00:32:29 GMT; path=/; domain=.google.com; HttpOnly
# 
succeeded

我用sedas command3 来说明它通过管道获得的内容—— http(即)输出的完整副本。

当心! grep默认情况下想要写入标准输出(就像我们的echoes 一样)。因此,在 command2 中,我将grep的输出重定向到 /dev/null,将两个echoes 重定向到 /dev/error。如果没有这些,标准输入在sed开始工作之前就会被改变。

这是没有 command2 重定向的代码片段:

$ http --print=h http://www.google.com | tee >( grep -c "HTTP/1.1 200" && echo "succeeded" || echo "failed") | sed 's/^/# /'
# HTTP/1.1 200 OK
# Date: Thu, 26 May 2022 00:35:01 GMT
... elided ...
# Set-Cookie: NID=511=L6sDnkpxBHQMA_L0JQCFqM; expires=Fri, 25-Nov-2022 00:35:01 GMT; path=/; domain=.google.com; HttpOnly
# 
# 1
# succeeded

sed看到grep -c一的计数,并且echo succeeded- 它前面加上“#”

答案2

我想出了一个解决方法

response=$(http --print=hb POST http://localhost:8080)
echo $response
echo $response | grep -c "HTTP/1.1 200" && echo "succeeded" || echo "failed")

相关内容