Estou escrevendo um script que lê a entrada do usuário e a divide em campos usando awk
. Desejo usar um desses campos no final do script e, portanto, estou tentando armazená-lo em alguma variável, mas em vão.
Uma solução possível é salvar a entrada e processá-la awk
novamente no final, mas gostaria de saber se existe alguma maneira de reter as informações já processadas em alguma variável.
por exemplo,
read -p "Enter args: "; echo -n $REPLY | awk '{ \*Do some stuff with fields*\; nth=$3}'
# More script
echo "Your 3rd argument was $nth"
mas acima não funciona. nth
está vazio no final (o que significa que era local para awk
?).
TIA
Responder1
Não tenho certeza sobre por que você precisa do awk, mas você pode adicionar o -a
sinalizador para read
obter um array. Supondo que o campo/colunas de que você está falando sejam delimitados/separados por um espaço.
read -rp "Enter args: " -a input
printf 'Your 3rd argument was %s\n' "${input[2]}"
- Apenas lembre-se de que os arrays bash começam no índice zero.
Você pode percorrer a entrada.
read -rp "Enter args: " -a input
for ((i=0; i<${#input[@]}; i++)); do
printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done
Ou assim
read -rp "Enter args: " -a input
for i in "${!input[@]}"; do
printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done
Mas aqui está o que eu faria usando o awk.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $3}' <<< "$REPLY")
printf 'Your 3rd argument was %s\n' "$nth"
Armazenando dois campos, 2º e 3º em apenas um nome de variável.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'The argument was %s\n' "$nth"
Se você deseja dividir o segundo e o terceiro campo em um nome de variável diferente.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'Your 2nd argument was %s\nYour 3rd argument was %s\n' "${nth#* }" "${nth% *}"
- O
"${nth#* }"
e"${nth% *}"
pode ser salvo com variáveis separadas.
Mais uma resposta para esta awk
impressão de todos os campos usando $0
e read
que remete à minha primeira resposta usandoread -ra
read -rp "Enter args: "
read -ra fields < <(awk '{\*Do some stuff with fields*\;print $0}' < <(printf '%s' "$REPLY"))
Imprimir todos os campos
printf '%s\n' "${fields[@]}"
- Minha primeira postagem/resposta a esta pergunta mostra como percorrer os campos dos arrays bash e como eles também são indexados.