표준 출력을 기준으로 하는 조건인 경우

표준 출력을 기준으로 하는 조건인 경우

조건부로 끝나는 여러 명령이 파이프를 통해 연결되어 있습니다 awk. 아래 예

command1 | command 2 | awk '$1 > 800'

이제는 때로는 몇 줄을 출력하고 때로는 출력하지 않습니다. 일부 출력(1줄 이상)이 있는 경우에만 true로 입증되는 조건을 원합니다. 이를 작동시킬 수 있는 방법이 있습니까?

좋다,

if command1 | command 2 | awk '$1 > 800' (some output); then
do command3
else; (blank output)
Do nothing

답변1

평소에는 그냥 사용하는데명령 대체, 그런 다음 테스트에 넣습니다.

if [ ! -z "$(command1 | command 2 | awk '$1 > 800')" ]; then command3; fi

설명하다

  • 귀하의 질문에 따라 명령이 실행됩니다.command1 | command 2 | awk '$1 > 800'
  • 출력은 test 로 전달되며 , 길이가 0인 문자열이 [ ! -z "$(…)" ]아닌 경우 true로 평가됩니다 .!-z

따라서 명령 파이프라인의 출력이 있으면 then명령이 실행됩니다.

답변2

awk명령문에 대한 올바른 반환 코드를 사용하여 스크립트를 종료합니다 if.

if command1 | command2 | awk '$1 > 800 { c++; print } END { exit (c == 0) }'
then
   command3
fi

아니면 실제로 그렇게 하지 않는다면필요프로그램 출력 awk:

if command1 | command2 | awk '$1 > 800 { c++; exit } END { exit (c == 0) }'
then
   command3
fi

답변3

awk다음과 같이 원하는 종료 코드를 인쇄 할 수 있습니다 .

echo 900 | awk '{ print !($1 > 800) }'

(그런 다음 및 를 사용하여 하위 쉘에 래핑하여 exit값을 반환할 수 있습니다 awk.

echo 900 | (exit $(awk '{ print !($1 > 800) }'))

그런 다음 파이프라인의 일부로 사용할 수 있습니다.

echo 900 | (exit $(awk '{ print !($1 > 800) }')) && echo yes || echo no

관련 정보