使用 SSH,在文件中搜索字符串和 return 最后一次出现时它旁边的值

Using SSH, search a file for a string and return the value next to it in the last occurence

我正在尝试找到一种方法来提取监控数据文件的值并进一步使用它。使用 SSH 连接(带密码)我想访问远程文件。在这个文件中,我想搜索一个特定的传感器名称。由于此文件包含来自许多传感器和不同时间步长的数据,我想选择最后一个(最新)字符串,此字符串旁边是传感器值,我想复制它并将其写入本地数据文件和在编程中进一步使用它。我可以将整个文件从服务器复制到本地,但整个文件很大,而且文件每小时都在变化。

时间传感器-名称传感器-值

25-05-2018;15:24 t_amb 24.8

25-05-2018;15:24 t_room 21.2

25-05-2018;15:24 G_global 120

25-05-2018;15:25 t_amb 25

25-05-2018;15:25 t_room 21

25-05-2018;15:25 G_global 227.8

例如,上面提到的文件位于通过 SSH 端口连接的另一台计算机上,我只想搜索字符串 't_room' 并在远程中找到它的最后一次出现文件并将其旁边的值“21”写入位于本地目录的文件中。

编辑:或多或少我想做类似的事情,但我想在 Python 中做而不是 bash 脚本:

sshpass -piHEM_MT17 ssh 192.168.101.53 "keysight" | egrep "SP_t_5_roh" | cut -d" " -f4 | tail -n 1 > /run/user/1000/temperaturtest.txt

您可以将数据通过管道传输到 grep 到 select 最后一行 tail 包含 "t_room",然后打印由 space 分隔的第 3 列使用 awk.

例如,如果您的数据保存在 log.txt:

cat log.txt | grep t_room | tail -n 1 | awk -F" " '{print }'

您可能需要做一些小的改动,但这很容易逐字地工作。

import pexpect
import re

def fetch_sensor_last(sensor_name):
    c = pexpect.spawn('ssh user@hostaddress')
    c.expect(': ') # wait for password prompt
    c.sendline('yourpassword')
    c.expect('$ ') # wait for unix prompt
    c.sendline('cat /full/path/to/log.txt | grep %s | tail -n 1')
    c.expect('$ ')
    c.close() # close ssh child process
    tail_output = c.before.splitlines()[0] # get command output

    # regex matches date, time, and sensor value (see www.regex101.com)
    match = re.match(
        rb'(\d+\-\d+\-\d+);(\d+:\d+)\s+\w+\s+([\d\.]+)', tail_output) 
    if match:
        return match.groups()

date, time, value = fetch_sensor_last(sensor_name)

Pexpect 本质上运行您在 bash 中生成它的命令,然后您只需 .expect('pattern') 等待预期的(显然是同名的)提示或其他文本模式。如果您需要检索文本,通常的方法是首先期待下一个提示,然后访问存储在 .before 中的 bytes 对象以获取自上次 .expect() 命令以来的所有 ascii 字节。

如果您需要对自动化进行故障排除,我建议 运行 在 python 之外手动执行命令,然后逐步完成该过程并记录您需要处理的所有提示(包括提示用于 rsa 警告等),并确保您没有遗漏任何内容。

请注意,您从 pexpect 中获取的字符串都是字节对象,您可以通过 bytesobj.decode().

将它们转换为普通的 python 字符串