如何恢复阅读文件?

时间:2015-06-26 21:43:44

标签: bash shell awk sed

我正在尝试找到从给定点恢复读取文件的最佳和最有效的方法。

经常写入给定文件(这是一个日志文件)。 此文件每天轮换。

在日志文件中,我正在寻找一种模式'慢事务'。这些行的结尾在括号中有一个数字。我希望得到数字的总和。

日志行示例:

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或高级编程语言。

我希望我的描述足够清楚。如果这是重复的,请道歉。我在发布之前做了一些研究,但没有找到与我的需求完全一致的东西。

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

除了注释链接中的方法之外,您还可以使用ddstat来读取日志文件大小,保存它并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