0

我需要定期发送一组可能会变得非常大的日志文件,因此我只想发送每个文件的最后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 机器。)

4

5 回答 5

1

您专注于特定的实现,而不是着眼于更大的图景。

如果最终目标是在目标机器上获得文件的精确副本,同时尽量减少传输的数据量,那么您应该使用 rsync,它仅自动发送文件中已更改的部分,同时也可以自动压缩在接收的同时发送和解压缩。

在目标机器上运行 rsync 不再需要标准 sshd 的守护进程,并且要设置没有密码的自动传输,您只需要使用公钥身份验证即可。

于 2009-05-18T20:24:55.797 回答
1

你可以试试

tail -n 10 your_file.txt | while read line; do zip /tmp/a.zip $line; done

zip文件在哪里a.zip,10是n

tail -n 10 your_file.txt | xargs tar -czvf test.tar.gz --

对于 tar.gz

于 2009-02-05T15:58:07.320 回答
0

使用logrotate

看看里面/etc/logrotate.d的例子。

于 2009-02-05T20:03:21.147 回答
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/*
于 2009-02-05T16:06:08.957 回答
-1

为什么不将您的日志文件放在 SCM 中?

您的接收者在他的机器上创建了一个存储库,他从该存储库中通过签出文件来检索文件。

您只需提交文件即可发送文件。只会传输差异。

于 2009-02-05T16:01:13.740 回答