Se-condição baseada na saída padrão

0

Eu tenho alguns comandos vinculados por meio de pipes e, no final, é um condicional awk : exemplo abaixo

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

Agora, às vezes, ela produzirá poucas linhas e, às vezes, nenhuma linha. Eu quero uma condição que só será verdadeira se houver alguma saída (1 ou mais linhas) Existe uma maneira de fazer isso funcionar?

Como,

if command1 | command 2 | awk '$1 > 800' (some output); then
do command3
else; (blank output)
Do nothing
    
por Sollosa 14.11.2018 / 12:39

3 respostas

3

Normalmente, uso apenas a substituição de comandos , e a coloco em teste , por exemplo

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

Explicação

  • Isso executa o comando conforme sua pergunta: command1 | command 2 | awk '$1 > 800'
  • A saída disso é passada para o teste [ ! -z "$(…)" ] , o que será verdadeiro se não for ! uma string de comprimento zero -z .

Portanto, se houver saída para o canal de comando, os comandos then serão executados.

    
por 14.11.2018 / 12:51
1

Faça o script awk sair com o código de retorno correto para a instrução if :

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

Ou, se você não precisa realmente da saída do programa awk :

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

Você pode deixar awk imprimir o código de saída desejado, assim:

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

Em seguida, isso pode ser agrupado em um subshell usando ( e exit , para retornar o valor de awk :

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

Que pode então ser usado como parte de um pipeline:

echo 900 | (exit $(awk '{ print !($1 > 800) }')) && echo yes || echo no
    
por 14.11.2018 / 13:31