httpie 명령의 출력을 인쇄하고 grep으로 파이프합니다.

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 ...

하지만 작동하지 않았습니다. 어떤 아이디어도 없습니다.

답변1

teestdin의 복사본을 다른 곳으로 보내기 위한 표준 유틸리티입니다. >()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기본적으로 표준 출력에 쓰기를 원합니다( echoes처럼). 따라서 command2에서는 grepes의 출력을 /dev/null로 리디렉션하고 두 echoes를 모두 /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

sedgrep -c1의 개수를 확인 하고 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")

관련 정보