我正在寻找一种方法来丢弃日志文件的内容,只留下定义的尾部。只需两步就很容易了:
tail -n1000 alert_migtst.log > alert_migtst.tail
mv -f alert_migtst.tail alert_migtst.log
是否有办法通过单个命令实现相同功能,以及其他避免可能出现的线路丢失的原因?
答案1
您可以使用sed
sed -e :a -e '$q;N;1001,$D;ba' -i filename
-e
定义脚本(命令):a
定义标签$q
定义一个地址($
文件末尾)并跳转q
到该地址N
将下一行输入附加到模式空间1001,$d
删除 1001 到文件末尾之间的所有行(因为前面的N
行将被附加到模式空间)ba
分支到开头定义的标签
例如(文件最后 3 行)
$ cat alert_migtst.log
1
2
3
4
5
6
7
8
9
$ sed -e :a -e '$q;N;4,$D;ba' -i alert_migtst.log
$ cat alert_migtst.log
7
8
9
答案2
您可以尝试使用海绵您可以使用软件包安装它moreutils
。它允许您将输出重定向到同一个文件(否则您将删除它)。
tail -n1000 alert_migtst.log | sponge alert_migtst.log
按照正常规则,在将其用于关键文件之前,请先对您找到的所有解决方案进行练习。
答案3
你可以在 Ex 模式下使用 Vim:
ex -sc '1,-1000d|x' alert_migtst.log
1,-1000
选择除最后 1000 行以外的所有行d
删除x
保存并关闭