Bash-Skript: Awk-Feld zur späteren Verwendung speichern

Bash-Skript: Awk-Feld zur späteren Verwendung speichern

Ich schreibe ein Skript, das Benutzereingaben liest und sie mithilfe von in Felder aufteilt awk. Ich möchte eines dieser Felder am Ende des Skripts verwenden und versuche daher, es in einer Variablen zu speichern, aber vergeblich.

awkEine mögliche Lösung besteht darin, die Eingabe zu speichern und sie am Ende erneut zu verarbeiten , aber ich habe mich gefragt, ob es eine Möglichkeit gibt, bereits verarbeitete Informationen in einer Variablen beizubehalten.

Zum Beispiel,

read -p "Enter args: "; echo -n $REPLY | awk '{ \*Do some stuff with fields*\; nth=$3}'

# More script

echo "Your 3rd argument was $nth"

aber oben funktioniert es nicht. nthist am Ende leer (was bedeutet, dass es lokal für awk? war).

TIA

Antwort1

Ich bin nicht sicher, warum Sie awk benötigen, aber Sie können das -aFlag hinzufügen, readdamit Sie ein Array erhalten. Vorausgesetzt, die Felder/Spalten, von denen Sie sprechen, sind durch ein Leerzeichen begrenzt/getrennt.

read -rp "Enter args: " -a input

printf 'Your 3rd argument was %s\n' "${input[2]}"
  • Denken Sie daran, dass Bash-Arrays beim Index Null beginnen.

Sie können die Eingabe in einer Schleife durchlaufen.

read -rp "Enter args: " -a input

for ((i=0; i<${#input[@]}; i++)); do
  printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done

Oder so

read -rp "Enter args: " -a input

for i in "${!input[@]}"; do
  printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done

Aber Folgendes würde ich mit awk tun.

read -rp "Enter args: "

nth=$(awk '{\*Do some stuff with fields*\; print $3}' <<< "$REPLY")

printf 'Your 3rd argument was %s\n' "$nth"

Speichern von zwei Feldern, dem 2. und 3., in nur einem Variablennamen.

read -rp "Enter args: "

nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")

printf 'The argument was %s\n' "$nth"

Wenn Sie das 2. und 3. Feld in einem anderen Variablennamen aufteilen möchten.

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% *}"
  • Die "${nth#* }"und "${nth% *}"können mit einer separaten Variable gespeichert werden.

Eine weitere Antwort hierzu ist awkdas Drucken aller Felder mit $0und readwas mich zu meiner ersten Antwort zurückbringt mitread -ra

read -rp "Enter args: "

read -ra fields  < <(awk '{\*Do some stuff with fields*\;print $0}' < <(printf '%s' "$REPLY"))

Alle Felder ausdrucken

printf '%s\n' "${fields[@]}"
  • Mein erster Beitrag/meine erste Antwort auf diese Frage zeigt, wie man durch die Felder von Bash-Arrays schleift und wie diese auch indiziert werden.

verwandte Informationen