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
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 hierbei 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.
Antwort1
Dieses Problem wurde durch die Verwendung einer while-Schleife mit IFS gelöst. Die Befehlsausgabe wird in der Variable ($filter) gespeichert und von der Schleife zeilenweise gelesen. Ich konnte keine Möglichkeit finden, den Befehl ohne Variable direkt in die Schleife zu übertragen (ich glaube, dies wird von der Shell-only-Bash nicht unterstützt).
#!/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