Используя SSH, найдите в файле строку и верните значение рядом с ней в последний раз - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь найти способ извлечь значение для файла данных мониторинга и использовать его далее.Используя соединение 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' в файл, который находится в каталоге локально.

Редактировать: Более или менее я хочу сделать подобное, но вместо скрипта bash я хочу сделать это на Python:

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 голосов
/ 25 мая 2018

Вам может потребоваться внести небольшие изменения, но это может легко сработать дословно.

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, чтобы получить все байты ascii с момента последней команды .expect().

Если вам нужноЧтобы устранить неполадки в автоматизации, я бы предложил выполнить команду вручную вне python, а затем пошагово пройти процесс и записать все запросы, с которыми вам нужно иметь дело (включая запросы на предупреждения rsa и т. п.), и убедиться, что вы ничего не пропустили.

Обратите внимание, что все строки, которые вы получаете из pexpect, являются байтовыми объектами, и вы можете преобразовать их в обычные строки python через bytesobj.decode().

0 голосов
/ 25 мая 2018

Вы можете направить данные в grep, чтобы выбрать последнюю строку с tail, содержащим "t_room", а затем вывести 3-й столбец, разделенный пробелом, используя awk.

Например, если вашданные сохраняются в log.txt:

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

...