쉘 스크립트는 목록을 한 줄씩 반복합니다.

쉘 스크립트는 목록을 한 줄씩 반복합니다.

목록(내가 실행하는 특정 명령에 의해 제공됨)을 한 줄씩 반복하고 값을 CSV 파일에 푸시하는 짧은 쉘 스크립트를 작성하려고 합니다.

예를 들면 다음과 같습니다.

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

이를 반복해야 하며 각 줄에 대해 첫 번째, 네 번째 및 여섯 번째 필드를 변수로 가져와서 약간의 조작을 수행할 수 있습니다.

#!/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 루프가 한 줄씩이 아니라 필드별로 진행된다는 것입니다. "awk"로 구문 분석할 수 있도록 각 줄을 $i에 넣어야 합니다.

답변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

관련 정보