我正在尝试找到从给定点恢复读取文件的最佳和最有效的方法。
经常写入给定文件(这是一个日志文件)。 此文件每天轮换。
在日志文件中,我正在寻找一种模式'慢事务'。这些行的结尾在括号中有一个数字。我希望得到数字的总和。
日志行示例:
2015年6月24日10:00:00缓慢交易(5)
2015年6月24日10:00:06缓慢交易(1)
这是一个很容易的部分,我可以使用awk命令以上面的例子获得总数6。
现在我的挑战是我想定期从这个文件中获取值。我有一个使用SNMP轮询自定义OID的外部系统。当命中此OID时,Linux主机会运行几个基本命令。
我希望此SNMP轮询事件获取自上次轮询以来的事件数。我不希望每次都有总数,只是新添加的总数。
只是提到只能使用bash,或者使用awk sed tail等基本命令。没有perl或高级编程语言。
我希望我的描述足够清楚。如果这是重复的,请道歉。我在发布之前做了一些研究,但没有找到与我的需求完全一致的东西。
感谢您的帮助
答案 0 :(得分:3)
除了注释链接中的方法之外,您还可以使用dd
和stat
来读取日志文件大小,保存它并sleep 300
然后再次检查日志文件大小。如果文件大小已更改,请使用dd
跳过旧信息并仅读取新信息。
注意:您可以添加测试来处理删除日志文件然后以0
大小重新启动的情况(例如if $((newsize < size))
然后全部读取。
以下是5 minute
间隔的简短示例:
#!/bin/bash
lfn=${1:-/path/to/logfile}
size=$(stat -c "%s" "$lfn") ## save original log size
while :; do
newsize=$(stat -c "%s" "$lfn") ## get new log size
if ((size != newsize)); then ## if change, use new info
## use dd to skip over existing text to new text
newtext=$(dd if="$lfn" bs="$size" skip=1 2>/dev/null)
## process newtext however you need
printf "\nnewtext:\n\n%s\n" "$newtext"
size=$((newsize)); ## update size to newsize
fi
sleep 300
done