我需要定期发送一组可能会变得非常大的日志文件,所以我只想发送每个文件的最后 n 行。
例如:
/usr/local/data_store1/file.txt (500 lines)
/usr/local/data_store2/file.txt (800 lines)
如果文件中包含名为files.txt
的所需文件列表,我想创建一个存档(tar或zip),其中包含每个文件的最后100行。
我可以通过使用尾部文件创建一个单独的目录结构来实现这一点,但这可能会浪费资源,因为可能会有一些管道魔法可以实现它。还必须保留完整的目录结构,因为文件在不同的目录中可以具有相同的名称。
如果可能的话,我希望解决方案是一个shell脚本,但perl(没有添加模块)也是可以接受的(这适用于没有安装ruby / python / etc ..的Solaris机器。)< / p>
答案 0 :(得分:1)
你可以尝试
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 --
for tar.gz
答案 1 :(得分:1)
你专注于一个特定的实现,而不是从更大的角度来看。
如果最终目标是在目标计算机上拥有文件的精确副本,同时最大限度地减少传输的数据量,那么您应该使用的是rsync,它只会自动发送已更改的文件部分,也可以在接收时自动压缩发送和解压缩。
运行rsync不需要标准sshd目标机器上的任何守护进程,并且设置没有密码的自动传输只需要使用公钥认证。
答案 2 :(得分:0)
没有管道魔法,你必须创建你想要的文件夹结构并压缩它。
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/*
答案 3 :(得分:0)
使用 logrotate 。
查看/etc/logrotate.d
内部的示例。
答案 4 :(得分:-1)
为什么不将日志文件放在SCM中?
您的接收者在他的机器上创建了一个存储库,通过检查文件来检索文件。
您只需提交文件即可发送文件。只传输差异。