Shell-Skript durchläuft Liste zeilenweise

Shell-Skript durchläuft Liste zeilenweise

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

verwandte Informationen