Bash

列印 httpie 命令的輸出,然後通過管道傳輸到 grep

  • May 26, 2022

如何列印 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 ...

但這沒有用,任何想法

tee是用於在別處發送標準輸入副本的標準實用程序。 >()是一個 bash 構造,它將標準輸入傳遞給任意命令。通常,我們只是管道,’|’ 直接,但在我們想要發送一份未更改的標準輸入的情況下,此功能在這裡有一些用途。

將它們組合起來,如下所示:

$ 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

我有命令 3 來說明它通過管道獲得的內容—— (即)輸出sed的完整副本。http

當心! grep想要預設寫入標準輸出(就像我們的echoes 一樣)。因此,在 command2 中,我將grep的輸出重定向到 /dev/null,並將兩個echoes 重定向到 /dev/error。沒有這些,stdin 在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 -c1 的計數,並且echo succeeded– 它在前面加上 ‘#’

引用自:https://unix.stackexchange.com/questions/703837