exit awk se nenhuma entrada

0

Eu preciso que o awk retorne o código de saída 1 se:

  • nenhuma entrada do grep para o awk foi fornecida
  • o segundo campo está vazio ou não existe

Está funcionando quando o grep encontra "SOME_PHRASE", mas se esta frase não sair, o código de retorno ($?) é 0.

grep -m1 -i '^SOME_PHRASE' test.txt | awk '{ if (length($val)==0 || $val=="" || length($2)==0) exit 1; else print $2; }'

exemplo de test.txt

Test1 1234  
Phrase 214324

Resultado esperado:

$ echo $?  
1
    
por Rokas.ma 01.03.2017 / 14:17

5 respostas

2

Você pode, de fato, combinar awk e grep :

awk 'BEGIN{rv=1}                      # Default return value is 1
     tolower($0) ~ /^some_phrase/{    # Case insensitive search 
         if($2 != ""){                # If $2 is not empty,
            print $2                  # print the value,
            rv=0                      # and set the return value
         } 
         exit                         # one match, do not process any more line 
     } 
     END{exit rv}
' test.txt
    
por 01.03.2017 / 15:25
1

Consegui alcançar o que queria.

grep -m1 -i 'SOME_PHRASE' test.txt | awk 'END { if (NR==0 || $2=="")  exit 1; else print $2;}'
    
por 01.03.2017 / 15:49
1

Mais direto:

$ awk 'toupper($1) ~ /^SOME_PHRASE/ { if ($2) { print $2; exit 0 } else { exit 1 } } END { exit 1 }' test.txt

O primeiro campo é alterado para maiúsculas e comparado com o padrão de letras maiúsculas. Se corresponder e se houver um segundo campo, esse campo será impresso e o script sairá com um status de saída zero; caso contrário (nenhum segundo campo), ele sairá com um status de saída igual a 1. Se o padrão nunca corresponder, o script sairá com um status de saída de 1 quando atingir o final da entrada.

    
por 01.03.2017 / 16:32
0

Além do fato de que awk é perfeitamente capaz de fazer o que o grep faz aqui, você também pode verificar explicitamente a entrada vazia em awk e, em seguida, retornar uma. Aqui, um bloco END verifica o número de linhas (registros) processadas:

$ echo foo | grep bar | awk 'END {if (NR == 0) exit  }' ; echo "exit value $?"
exit value 1

Ou use o shell para obter o código de retorno do processo com falha no pipeline, mesmo que não seja o último. Eu não acho que o shell padrão pode fazer isso, mas por exemplo no Bash, set -o pipefail :

$ set -o pipefail 
$ echo foo | grep bar | awk '{exit 0}' ; echo "exit value $?"
exit value 1

(Bash também tem PIPESTATUS se você quiser ver os valores de retorno de todos os processos no pipeline).

    
por 01.03.2017 / 16:59
0

Você deve considerar mover tudo dentro de um telhado / ferramenta para simplificar:

grep -qE '^SOME_PHRASE.*[^[:space:]]' yourfile

perl -0777ne 'exit !/^SOME_PHRASE.*?\S/m' yourfile

sed -ne '/^SOME_PHRASE.*[^[:space:]]/q;$q1' yourfile

Saída

Para os dados mostrados, imediatamente após a execução de um dos comandos acima, executamos:

echo "$?"
1

Breve

Perl slurps de todo o seu arquivo e procura a palavra-chave no início de uma linha, que está ativada para multiline strings usando //m modifier. O ! está lá para explicar o fato de que SUCCESS in Perl & Unix worlds é complementar.

Sed é operado em don't print unless asked for mode -n e assumindo GNU sed que possui o comando q que também inclui o status de saída.

    
por 02.03.2017 / 06:23

Tags