![Bash 脚本:使用 sed 中的变量删除文件除最后“x”行之外的所有内容](https://linux22.com/image/1424533/Bash%20%E8%84%9A%E6%9C%AC%EF%BC%9A%E4%BD%BF%E7%94%A8%20sed%20%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E9%99%A4%E6%9C%80%E5%90%8E%E2%80%9Cx%E2%80%9D%E8%A1%8C%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9.png)
我正在使用以下 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