Sie haben export worker01="sdg sdh sdi sdj sdk"
, dann ersetzen Sie =
mit einem Leerzeichen, um export worker01 "sdg sdh sdi sdj sdk"
zu erhalten . Die durch Leerzeichen getrennten Felder darin sind export
, worker01
, "sdg
, sdh
usw.
Es ist wahrscheinlich besser, auf =
aufzuteilen , und entfernen Sie die Anführungszeichen, also nur mit der Shell:
$ while IFS== read -r key val ; do
val=${val%\"}; val=${val#\"}; key=${key#export };
echo "$key = $val";
done < vars
worker01 = sdg sdh sdi sdj sdk
worker02 = sdg sdh sdi sdj sdm
worker03 = sdg sdh sdi sdj sdf
key
enthält den Variablennamen val
der Wert. Natürlich analysiert dies die Eingabe nicht wirklich, es entfernt nur die doppelten Anführungszeichen, falls sie zufällig vorhanden sind.
Mit awk allein:
awk -F'"' '{print $2}' file.txt
# To print the variable name as well:
awk '{gsub(/[:=]/," "); gsub(/[:"]/,""); if ($1 = "export") {$1=""; print $0}}' file.txt
Um es zu loopen, können Sie:
for i in "$(awk -F\" '{print $2}' file.txt)"; do
var="$i"
echo "$var"
done
my_array=($(awk -F\" '{print $2}' file.txt))
for element in "${my_var[@]}"; do
another_var="$element"
echo "$another_var"
done
Wenn Sie auch den Variablennamen in Ihrer Schleife ausgeben möchten, können Sie dies tun:
#! /usr/bin/env bash -
while read -r line; do
if [[ "$(awk '{print $1}' <<<"$line")" == 'export' ]]; then
var_name="$(awk '{print $2}' <<<"$line" | awk -F'=' '{print $1}')"
var_value="$(awk -F\" '{print $2}' <<<"$line")"
echo -e "${var_name}\n${var_value}"
else
continue
fi
done<file.txt
Ausgabe:
$ ./script.sh
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf
Erstens können Sie die Variablennamen mit diesem GNU-Grep-Befehl abrufen, indem Sie einen Perl-kompatiblen regulären Ausdruck verwenden:
grep -oP 'export \K[^=]+' file.txt
Dann können Sie die Ausgabe davon in ein Bash-Array einlesen mit:
mapfile -t variables < <(grep -oP 'export \K[^=]+' file.txt)
Das verwendet den in Bash eingebauten mapfile
Befehl und eine Prozessersetzung.
Zuletzt iterieren Sie über die Variablennamen und verwenden Sie indirekt Parametererweiterung um die Werte zu erhalten:
for v in "${variables[@]}"; do
printf "varname=%s\tvalue=%s\n" "$v" "${!v}"
done
varname=worker01 value=sdg sdh sdi sdj sdk
varname=worker02 value=sdg sdh sdi sdj sdm
varname=worker03 value=sdg sdh sdi sdj sdf