シェルスクリプトはリストを1行ずつループします

シェルスクリプトはリストを1行ずつループします

私は、リスト(実行した特定のコマンドによって与えられた)を1行ずつループし、値をCSVファイルにプッシュする短いシェルスクリプトを書こうとしています。

たとえば次のリストを参照してください。

aaa   bbb   ccc   ddd   eee   fff
jjj   kkk   lll   mmm   nnn   ooo
uuu   vvv   www   xxx   yyy   zzz

これをループして、各行の 1 番目、4 番目、6 番目のフィールドを変数に格納し、それらに対して何らかの操作を行う必要があります。

#!/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

ここでの問題は、for ループがフィールドごとに実行され、行ごとに実行されないことです。各行を $i に格納して、「awk」で解析できるようにする必要があります。

答え1

この問題は、IFS で while ループを使用することで解決されました。コマンド出力は変数 ($filter) に保存され、ループによって行ごとに読み取られます。変数を使用せずにコマンドをループに直接プッシュする方法は見つかりませんでした (これはシェルのみの bash ではサポートされていないと思います)

#!/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

関連情報