grep文字列セットを1行に

grep文字列セットを1行に

テキストファイルでこれを行うと

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行として扱わないでください。

この問題をどのように解決できますか?

答え1

DopeGhotiの言葉は絶対に正しいです。ここでより適切な内容があります。プロセス置換を使用してgrep出力から1行ずつ読み込みます(パターンは現在のディレクトリのすべての* .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

関連情報