如何从日志文件中获取最后一个值
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
打破以上命令:
- grep 'Temp' stack.log -> 在给定的日志文件中搜索 "Temp" 字符串。
- tail -4 -> 将从上述命令输出中提取最后 4 条记录。
gawk -F= '{print $2}' -> 使用“=”作为分隔符并打印第一列,
例如 :
29.0* 湿度
21.0* 湿度
22.0* 湿度
28.0* 湿度
gawk '{print $1}' -> 使用"space" 作为分隔符并打印第一列
单独,例如:
29.0*
21.0*
22.0*
28.0*
sed s///g -> 将所有“”(星号)替换为空白“”(空白)。
最终输出如下:
29.0
21.0
22.0
28.0
您可以将其重定向到一个文件并在您的程序中读取温度。
我有一个日志文件,其中包含温度值。
使用此代码,我只能从中提取温度值。
代码:
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
打破以上命令:
- grep 'Temp' stack.log -> 在给定的日志文件中搜索 "Temp" 字符串。
- tail -4 -> 将从上述命令输出中提取最后 4 条记录。
gawk -F= '{print $2}' -> 使用“=”作为分隔符并打印第一列, 例如 : 29.0* 湿度 21.0* 湿度 22.0* 湿度 28.0* 湿度
gawk '{print $1}' -> 使用"space" 作为分隔符并打印第一列 单独,例如: 29.0*
21.0*
22.0*
28.0*
sed s///g -> 将所有“”(星号)替换为空白“”(空白)。
最终输出如下:
29.0
21.0
22.0
28.0
您可以将其重定向到一个文件并在您的程序中读取温度。