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
パイプを介して得られる内容、http
つまり出力の完全なコピーを説明するためにcommand3を使用しています。
注意してください! grep
デフォルトでは標準出力に書きたい(echo
esのように)。したがって、command2はgrep
esの出力を/ 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
1の個数を確認し、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")