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")