grep 不保存所有行

grep 不保存所有行

您好,社区中的某人编写了这段代码。问题是,当我尝试将 grep 的输出保存在文件中时,Positivos.txt它只保存最后一天,而不是所有循环。我尝试使用grep -r -o但没有成功。

d1="2020-03-15"
until [[ "$d1" ==  $ano-$mes-$dia ]]
do
rep=$( date -d "$d1" +%d/%m/%Y )
d1=$( date -I -d "$d1 + 1 day" )
grep -o "$estado.*$rep" /home/efc20/Proyecto/CasosPositivos.csv > Positivos.txt
done

答案1

grep被调用多次。接下来的每个调用都会覆盖前一个调用的输出。

  1. 您可以改为附加:

    d1="2020-03-15"
    until [[ "$d1" ==  $ano-$mes-$dia   ]]
    do
    rep=$( date -d "$d1" +%d/%m/%Y )
    d1=$( date -I -d "$d1 + 1 day" )
    grep   -o "$estado.*$rep" /home/efc20/Proyecto/CasosPositivos.csv >> Positivos.txt
    done
    
  2. 您可以收集整个循环的输出并将其写入文件,这样只需一次写入(即文件的一次打开)。存在一定的风险,即循环的其他部分(更改代码后)创建的输出会无意中写入同一文件。

    d1="2020-03-15"
    until [[ "$d1" ==  $ano-$mes-$dia   ]]
    do
    rep=$( date -d "$d1" +%d/%m/%Y )
    d1=$( date -I -d "$d1 + 1 day" )
    grep   -o "$estado.*$rep" /home/efc20/Proyecto/CasosPositivos.csv
    done > Positivos.txt
    
  3. 最优雅的解决方案(在这种情况下没有实际区别)是打开一个新的文件描述符:

    exec 3>Positivos.txt
    d1="2020-03-15"
    until [[ "$d1" ==  $ano-$mes-$dia   ]]
    do
    rep=$( date -d "$d1" +%d/%m/%Y )
    d1=$( date -I -d "$d1 + 1 day" )
    grep   -o "$estado.*$rep" /home/efc20/Proyecto/CasosPositivos.csv >&3
    done
    

相关内容