grep 문자열 세트를 한 줄로

grep 문자열 세트를 한 줄로

텍스트 파일에서 이 작업을 수행하면

grep FINAL *.msg

그것은 돌아온다

FINAL   COMPUTATIONS:  Elapsed Time: 000:30:55.65; CPU Time: 000:30:26.53  
FINAL   COMPUTATIONS:  Elapsed Time: 000:28:11.77; CPU Time: 000:27:41.36  

이제 for 루프를 수행하면

for line in `grep FINAL *.msg`

"$line""FINAL COMPUTATIONS: Elapsed Time: 000:30:55.65; CPU Time: 000:30:26.53"한 줄로 취급하지 마십시오 .

이 문제를 어떻게 해결할 수 있나요?

답변1

DopeGhoti의 말이 절대적으로 옳습니다. 여기에 더 적절할 수 있는 내용이 있습니다. 프로세스 대체를 사용하여 grep 출력에서 ​​한 줄씩 읽습니다(패턴은 현재 디렉터리의 모든 *.msg 파일에 적용됩니다).

i=0; 
while read -r line; do 
    echo $((i++)) "$line"; 
done < <(grep "FINAL" ./*.msg)

Shellcheck 경고가 없는 코드 조각 :)

답변2

이는 쉘이 입력을 분할하는 방식과 관련이 있습니다. 별도로 명시하지 않는 한 공백은 일반적으로 입력을 분할한다는 점을 기억하십시오.

$ echo "Foo bar baz"
Foo bar baz
$ for word in $(echo "Foo bar baz"); do echo $word; done
Foo
bar
baz

관련 정보