Bash 脚本:使用 sed 中的变量删除文件除最后“x”行之外的所有内容

Bash 脚本:使用 sed 中的变量删除文件除最后“x”行之外的所有内容

我正在使用以下 bash 脚本删除日志文件中除最后的“x”行之外的所有内容:

#!/bin/bash
# Script to  write to the log file every minute  and delete all but the last 
# set time in hours

echo `date +\%Y\%m\%d\%H\%M\%S`,`/home/pi/temp/temp` >> /home/pi/temp/temp.log

HOURS="12"                      #Nr of hours in the log
LINES=$(( $HOURS * 60 + 1 ))    #Nr of minutes/lines in the log

echo $LINES                     #Included just for testing if i'm getting the desired amount of lines

sed -e :a -e '$q;N;$LINES,$D;ba' temp.log >temp1.log ;mv temp1.log  temp.log

我用 $LINES 替换它的值(12 小时)721,并且脚本作为 cron 任务运行,每分钟运行一次,没有错误,所以我确定错误出在 sed 中包含变量的部分。

另外,我只是从某个网站上复制了这个,如果有人能好心地向我解释一下 sed 命令中发生了什么,也许我自己就能找出错误。

这是错误:

sed: -e expression #2, char 8: extra characters after command.

此外,它会删除文件中的所有行。

答案1

您需要将变量从单引号中取出:

sed -e :a -e '$q;N;'"$LINES"',$D;ba' 

其他说明:

  • 摆脱使用全大写变量名的习惯。有一天你会写出 PATH=/tmp,然后想知道为什么你的脚本坏了。
  • %对于 shell 来说,这不是一个特殊字符,所以不需要对其进行转义:date +%Y%m%d%H%M%S
  • 使用$(...)它而不是反引号:更容易看到并且更容易嵌套。
  • sed 可以就地编辑文件,您不需要写入临时文件,mv它:

    sed -i -e :a -e '$q;N;'"$LINES"',$D;ba' 
    
  • 这非常类似于这个stackoverflow答案有据可查。阅读后可获得深刻见解。

答案2

我知道这不是您想要的答案,因为它与 sed 无关,但您可以tail按照您想要的方式使用,只需执行以下操作:

tail -n <lines> <file> > <new_file>

mv new_file file

相关内容