Você pode fazer todo o trabalho em awk
:
#!/bin/sh
file=$2
awk -v theta="$1" -F '[= ]+' '
$0 ~ theta { print $12; found++ }
END { if (!found) { print "Not available"; exit 1 } }' "$file"
Você pode querer adicionar tratamento de erros para verificar
que existem dois argumentos de linha de comando,
e $2
é o nome de um arquivo legível, porque
- se
$2
for algo diferente de um arquivo legível, você receberá uma mensagem de erro deawk
- se
$2
estiver em branco ou ausenteawk
lerá silenciosamente a partir da entrada padrão.
(É claro que um ou ambos os comportamentos podem estar bem com você.)
Notas:
- Você pode obter resultados mais segmentados alterando
$0 ~ theta
para$8 == theta
. - Variáveis em
awk
são inicializadas em branco. Isso é tratado como 0 em contextos matemáticos, portanto,found++
definefound
para 1 na primeira vez em que é executado. Eu disse deliberadamentefound++
em vez defound = 1
, se várias linhas corresponderem ao valor theta,found
será definido para o número de tais linhas. Isso parece que deveria ser uma condição de erro; Se você está preocupado com isso, você pode modificar o blocoEND
relatar um erro sefound
for algo diferente de 1. - Claro, se você precisar que seu script faça uma coisa se um valor for encontrado
e outra coisa, se não for
você pode excluir a instrução
print
do blocoEND
e faça o script apenas testar o status de saída deawk
e emite sua própria mensagem de erro. Você também deve fazer isso se você quiser capturar a saída doawk
(ou seja, o valor θ2). Por outro lado, se tudo o que você precisa é de uma mensagem de erro legível por humanos, e você não precisa ser capaz de verificar o status de saída, você pode excluir a instruçãoexit
do blocoEND
.