Bash
列印 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 ...
但這沒有用,任何想法
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
想要預設寫入標準輸出(就像我們的echo
es 一樣)。因此,在 command2 中,我將grep
的輸出重定向到 /dev/null,並將兩個echo
es 重定向到 /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 -c
1 的計數,並且echo succeeded
– 它在前面加上 ‘#’