linux - 在 Linux 中频繁轮换日志时如何复制所需的日志文件内容
问题描述
假设一些日志以每个 50MB 的大小旋转。我做了'grep'一些字符串,我的字符串出现在日志文件 log_3 中,我想在它被旋转(重命名)到 log_4 之前复制 log_3 的内容。请建议如何在轮换之前备份 log_3 的内容。我只需要 log_3 的内容。我不想像我复制 log_3 (通过 cp -p log_3 log_3_backup)但是到那时日志已经轮换,现在 log_3_backup 包含 log_2 的内容。有什么办法可以避免这种情况。在一个自动化项目上工作,我需要一个解决方案。非常感谢您在高级的建议。您可以共享 python 或 shell 脚本。
解决方案
您可以获取重命名后不会更改的文件 inode 编号,然后按该名称引用文件
for f in *.log; do
# get inode of file
iname=$(ls -i $f)
# test file contents for pattern presence
if grep -q 'some pattern' $f; then
# the file contains the searched pattern, let's do something
# find by inode number and move it
find -inum $iname -exec mv {} {}.bak ';'
fi
done
也许不再需要备份文件了,让我们再次 grep
find -inum $iname -print0 | xargs -r0 grep 'some pattern'
推荐阅读
- go - 递归遍历任意数量的嵌套映射
- python - Python Selenium 错误 - StaleElementReferenceException:消息:过时的元素引用:元素未附加到页面文档
- python - os.walk 重命名包含“。”的文件夹
- c# - com 端口可用性更改后刷新 ui
- java - 不知道为什么while循环没有循环
- leaflet - 如何通过 Mapbox GL JS 在客户端使用 Mapbox Terrain RGB
- java - Spring Boot Hibernate 创建名称错误的表
- python - 在 Vision Transformer 中用 ImageLinearAttention 代替 SelfAttention 的挑战
- javascript - 使用正则表达式从字符串中删除所有非拉丁语段落
- sparql - SPARQL wikidata group-by:拥有多个城市的河流