使用 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 字符串
我正在尝试找到一种方法来提取监控数据文件的值并进一步使用它。使用 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()
.