shell腳本逐行循環遍歷列表

shell腳本逐行循環遍歷列表

我正在嘗試編寫一個簡短的 shell 腳本來逐行循環遍歷列表(由我運行的某個命令給出)並將值推送到 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

透過將 while 迴圈與 IFS 結合使用已解決此問題。命令輸出儲存在變數($filter)中並透過循環逐行讀取。我找不到將命令直接推送到不帶變數的循環中的方法(我相信只有 shell 的 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

相關內容