Unix 将最后n行文件添加到tar/zip
我需要定期发送一组日志文件,这些文件可能会变得很大,所以我只想发送每个文件的最后n行 例如:Unix 将最后n行文件添加到tar/zip,unix,shell,zip,tar,Unix,Shell,Zip,Tar,我需要定期发送一组日志文件,这些文件可能会变得很大,所以我只想发送每个文件的最后n行 例如: /usr/local/data_store1/file.txt (500 lines) /usr/local/data_store2/file.txt (800 lines) 给定一个名为files.txt的包含所需文件列表的文件,我想创建一个包含每个文件最后100行的存档(tar或zip) 我可以通过创建一个带有尾部文件的单独目录结构来实现这一点,但这似乎是在浪费资源,因为可能需要一些管道魔法来实现
/usr/local/data_store1/file.txt (500 lines)
/usr/local/data_store2/file.txt (800 lines)
给定一个名为files.txt
的包含所需文件列表的文件,我想创建一个包含每个文件最后100行的存档(tar或zip)
我可以通过创建一个带有尾部文件的单独目录结构来实现这一点,但这似乎是在浪费资源,因为可能需要一些管道魔法来实现这一点。完整的目录结构也必须保留,因为文件在不同的目录中可以有相同的名称
如果可能的话,我希望解决方案是一个shell脚本,但是perl(不添加模块)也是可以接受的(这适用于没有安装ruby/python/etc.的Solaris机器。)您可以尝试
tail -n 10 your_file.txt | while read line; do zip /tmp/a.zip $line; done
其中a.zip
是zip文件,10是n
或
tail -n 10 your_file.txt | xargs tar -czvf test.tar.gz --
对于tar.gz,为什么不将日志文件放在SCM中 您的接收者在其计算机上创建一个存储库,通过签出从中检索文件
您只需提交文件即可发送文件。只有差异会被传输。没有管道魔法,你必须创建你想要的文件夹结构并压缩它
mkdir tmp
for i in /usr/local/*/file.txt; do
mkdir -p "`dirname tmp/${i:1}`"
tail -n 100 "$i" > "tmp/${i:1}"
done
zip -r zipfile tmp/*
使用logrotate
查看一下
/etc/logrotate.d
中的示例。您关注的是一个特定的实现,而不是全局
如果最终目标是在目标机器上拥有文件的精确副本,同时最大限度地减少传输的数据量,那么您应该使用rsync,它只自动发送已更改的部分文件,还可以在发送时自动压缩,在接收时自动解压缩
在目标机器上运行rsync不需要任何标准sshd守护进程,要设置无密码自动传输,只需使用公钥身份验证。是。考虑到cvs或svn已经安装,这非常容易实现和使用。这绝对是一个有趣的解决方案,但并不适用于这种情况。我需要对日志进行加焦油处理,以便偶尔发送给外部支持机构。我也不想发送庞大的日志,只想在发生错误时发送最后几行。