如何从日志文件中获取最后一个值

How to get last values from a log file

我有一个日志文件,其中包含温度值。
使用此代码,我只能从中提取温度值。

代码:

import re
import itertools

infile = "/home/pi/Mysensor/Logs/test.log"
for line in open(infile):
    match = re.search('Temp=(\d+)', line)
    if match:
        test = match.group(1)
        print test

我的日志文件:

2017-08-04 -> 16:14:29
Temp=28.0*  Humidity=36.0%

代码输出:

28
28
25
29
28
25

我想做的是,只提取最后四个结果。
我试过数组和列表。但是没有得到结果。

我在这里错过了什么?
如何让这个程序只得到最后四位的结果?

提前致谢。

您可以将温度保存在列表中,并使用切片获取最后 4 个:

import re
import itertools
temps = []
infile = "/home/pi/Mysensor/Logs/test.log"
for line in open(infile):
    match = re.search('Temp=(\d+)', line)
    if match:
      test = match.group(1)
      temps.append(test)
print temps[:-5:-1]

要了解有关切片的更多信息,see this post

我想这实际上取决于您的日志文件有多大,但我可以想到几种方法来实现。

最简单的可能是使用 deque

from collections import deque
import re

temps = deque(maxlen=4)

infile = "/home/pi/Mysensor/Logs/test.log"
with open(infile, "r") as fh:
    for line in fh:
        match = re.search('Temp=(\d+)', line)
        if match:
            temp = match.group(1)
            temps.append(temp)

一种直接的方法是使用 linux shell

中的 tail
  1 import os
  2 
  3 def my_tail(f, n):
  4     stdin, stdout = os.popen2("tail -n " + str(n) + " "+ f)
  5     lines = stdout.readlines();
  6     return lines
  7     
  8 print my_tail("./my_log.txt",4)

如果您认为其他语言也可以做到这一点,您可以在 bash shell 中使用以下命令(假设日志文件名为 stack.log) :

grep 'Temp' stack.log |尾巴-4 | gawk -F= '{print $2}' | gawk '{print $1}' | sed s/*//g

打破以上命令:

  1. grep 'Temp' stack.log -> 在给定的日志文件中搜索 "Temp" 字符串。
  2. tail -4 -> 将从上述命令输出中提取最后 4 条记录。
  3. gawk -F= '{print $2}' -> 使用“=”作为分隔符并打印第一列, 例如 : 29.0* 湿度 21.0* 湿度 22.0* 湿度 28.0* 湿度

  4. gawk '{print $1}' -> 使用"space" 作为分隔符并打印第一列 单独,例如: 29.0*

    21.0*

    22.0*

    28.0*

  5. sed s///g -> 将所有“”(星号)替换为空白“”(空白)。

最终输出如下:

29.0

21.0

22.0

28.0

您可以将其重定向到一个文件并在您的程序中读取温度。