
Ich versuche, ein kurzes Shell-Skript zu schreiben, um eine Liste (angegeben durch einen bestimmten Befehl, den ich ausführe) Zeile für Zeile zu durchlaufen und Werte in eine CSV-Datei zu übertragen
eine Liste zum Beispiel:
aaa bbb ccc ddd eee fff
jjj kkk lll mmm nnn ooo
uuu vvv www xxx yyy zzz
Ich muss dies durchlaufen und für jede Zeile das 1., 4. und 6. Feld in Variablen übernehmen, damit ich sie bearbeiten kann.
#!/bin/sh
#
CSVfile="/tmp/`hostname`.csv"
filter=$( command )
touch $CSVfile
#
for i in $filter
do
first=$( printf "$i" | awk {'print$1'})
fourth=$( printf "$i" | awk {'print$4'})
sixth=$( printf "$i" | awk {'print$6'})
cmd=$( cat /home/app/$first/$fourth/out | grep value | awk -F: {'print$2'})
echo `date +%d%m%Y,%H%M%S`,"$sixth","$cmd" >> $CSVfile
done
das Problem hier ist, dass die For-Schleife Feld für Feld und nicht Zeile für Zeile durchgeht. Jede Zeile muss in $i eingehen, damit ich sie mit „awk“ analysieren kann.
Danke
Antwort1
Dies wurde durch die Verwendung einer While-Schleife mit IFS gelöst, die die Filtervariable als Eingabe erhält.
Es konnte kein Grund gefunden werden, den Befehl in eine While-Schleife zu setzen, ohne ihn in einer Variablen zu speichern.
#!/bin/sh
#
CSVfile="/tmp/`hostname`.csv"
filter=$( command )
touch $CSVfile
#
while IFS= read -r line
do
first=$( printf "$i" | awk {'print$1'})
fourth=$( printf "$i" | awk {'print$4'})
sixth=$( printf "$i" | awk {'print$6'})
cmd=$( cat /home/app/$first/$fourth/out | grep value | awk -F: {'print$2'})
echo `date +%d%m%Y,%H%M%S`,"$sixth","$cmd" >> $CSVfile
done < $filter