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

这个问题已经通过使用 IFS 的 while 循环得到解决。命令输出存储在变量 ($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

相关内容