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

时间:2018-05-25 13:33:58

标签: python ssh scp

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

2 个答案:

答案 0 :(得分:1)

您可以将数据传输到<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <!-- YOUR ITEMS BETWEEN TABBAR AND APPBAR--> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <LinearLayout app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- YOUR CUSTOM TABBAR--> </LinearLayout> <android.support.v4.widget.NestedScrollView android:fillViewport="true" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- YOU MAIN CONTENT--> </android.support.v4.widget.NestedScrollView> </LinearLayout> </LinearLayout> </android.support.design.widget.CoordinatorLayout> </RelativeLayout> 以选择包含“t_room”的grep的最后一行,然后使用tail打印以空格分隔的第3列。

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

awk

答案 1 :(得分:0)

您可能需要进行一些小的更改,但这可以很容易地逐字处理。

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字符串。