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