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
$2for algo diferente de um arquivo legível, você receberá uma mensagem de erro deawk - se
$2estiver em branco ou ausenteawklerá 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 ~ thetapara$8 == theta. - Variáveis em
awksão inicializadas em branco. Isso é tratado como 0 em contextos matemáticos, portanto,found++definefoundpara 1 na primeira vez em que é executado. Eu disse deliberadamentefound++em vez defound = 1, se várias linhas corresponderem ao valor theta,foundserá 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 blocoENDrelatar um erro sefoundfor 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
printdo blocoENDe faça o script apenas testar o status de saída deawke 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çãoexitdo blocoEND.