![打印 httpie 命令的输出,然后通过管道传输到 grep](https://linux22.com/image/206282/%E6%89%93%E5%8D%B0%20httpie%20%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%EF%BC%8C%E7%84%B6%E5%90%8E%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%88%B0%20grep.png)
如何打印 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
command2
并command3
看到同样的事情
对于您的用例,请尝试:
$ 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
我用sed
as command3 来说明它通过管道获得的内容—— http
(即)输出的完整副本。
当心! grep
默认情况下想要写入标准输出(就像我们的echo
es 一样)。因此,在 command2 中,我将grep
的输出重定向到 /dev/null,将两个echo
es 重定向到 /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")