명령을 구문 분석하는 동안 명령의 출력을 어떻게 표시할 수 있나요?

명령을 구문 분석하는 동안 명령의 출력을 어떻게 표시할 수 있나요?

현재 는 두 개의 명령을 가지고 build있으며 수동으로 실행하고 출력을 직접 눈으로 분석하고 출력에서 ​​찾은 값을 인수로 사용합니다 . 프로세스는 다음과 같습니다.deploybuilddeploy

$ build
==> amazon-ebs: amazon-ebs output will be in this color.
... hundreds of lines of output ...
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-19601070

$ deploy ami-19601070
... some more output ...

( build실제로는포장기, 정통한 사람을 위해)

이 두 단계를 하나의 스크립트로 결합하고 싶습니다. 대략적인 개요에는 다음이 포함됩니다.

  • 달리기build
  • 0종료 상태가 다음과 같고 출력에 "AMIs was Created"라는 문자열이 포함되어 있는지 확인하고 , 그렇지 않으면 중단하십시오.
  • ami-19601070출력()에서 AMI 번호 추출
  • 달리기deploy ami-19601070

가급적이면 쉘 스크립트를 사용하여 모든 것을 함께 연결하는 가장 좋은 방법을 찾으려고 노력하고 있지만 이상적으로는 모든 stdout/stderr 메시지를 터미널로 스트리밍하면서 두 개의 개별 패턴의 출력을 grep하는 방법에 갇혀 있습니다. 명령이 실행됩니다. 이 작업을 쉘 스크립트에서 수행한다는 생각을 버리고 대신 이를 수행하기 위해 작은 Python 스크립트를 작성해야 하는지 궁금합니다.

답변1

직업 같은데tee:

build | tee /some/file
ami_name=$(do_something_to /some/file)
deploy "$ami_name"

답변2

 deployArgs=`build | tee /dev/tty  | extractDeployArgs` &&
    deploy "$deployArgs" #won't run unless extractDeployArgs suceeded

tee /dev/tty터미널에 직접 인쇄하고 동시에 출력을 파이프의 다음 명령으로 파이프합니다.

(이 파일을 다른 파일로 자유롭게 바꾸십시오(또는 /dev/fd/"$someFileDescriptor"측면 출력을 로 리디렉션해야 하는 경우 $someFileDescriptor))

고급 셸( ksh, bash, zsh그러나 에서는 해당되지 않음 dash) 에서는 set -o pipefail링크 중 하나라도 실패하면 파이프가 실패하도록 보장할 수 있습니다( extractDeployArgs입력에서 build성공을 확인할 수 없는 경우 유용함 ).

답변3

tf=$(mktemp)
build | tee "$tf"
grep -Fq 'AMIs were created' "$tf" && ami=$(grep -o 'ami-[0-9]\+$' "$tf")

# you didn't say if `deploy` can handle multiple args or not.
# uncomment one of the following:
# deploy $ami
# for a in $ami ; do deploy "$a" ; done

답변4

특정 출력 문자열에 관심이 있는 경우 다음과 같이 실행할 수 있습니다.

msg="$(build | grep -e "AMIs were created\|ami-[0-9]*")"

if [ -n "$(echo $msg | grep -e "AMIs were created")" ];then
    ami="$(echo "$msg" | grep -e "ami-[0-9]*" | cut -d ' ' -f 2)"
    deploy "$ami"
else
    exit 1
fi

첫 번째 grep은 출력에서 ​​AMI가 생성되었음을 보고하는 행 또는 ami-#만 선택합니다. "AMI Created" 출력을 확인하고, 있는 경우 관련 출력에서 ​​ami-#을 구문 분석하여 배포에 사용합니다.

관련 정보