목록(내가 실행하는 특정 명령에 의해 제공됨)을 한 줄씩 반복하고 값을 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