Как искать несколько строк в файле с многострочной строкой - PullRequest
0 голосов
/ 24 марта 2019

Попытка написать сценарий, который будет искать весь файл для определенных строк.

Для более чем 2 строк.

1) Первый поиск - это проверить одну из следующих двухстроки:

0/RP1/CPU0    RP(Active)

или

0/RP0/CPU0    RP(Active)

Если '0/RP1/CPU0 RP(Active)', выведите это сообщение "execute command location 0/rp1/cpu0"

Если '0/RP0/CPU0 RP(Active)', то напечатайтеэто сообщение "execute command location 0/rp0/cpu0"

2) Второй поиск - проверка на наличие одной из следующих многострочных: a)

INFO_LINE------------------: TITLE_LINE(A-Z)
  State                              : ENABLED

b)

INFO_LINE------------------: TITLE_LINE(A-Z)
  State                              : DISABLE

TITLE_LINE(A-Z) может незначительно отличаться, но INFO_LINE будет статичным и одинаковым в ENABLED или DISABLE.

Если b) true, выведите «restart process on location (FROM SEARCH1).

Я пробовал if/else/elif операторы и исследовал использование re.search для регулярных выражений.

#!/usr/bin/python
activerp = open('sample-output.txt')

def check_active_rp():
    for line in activerp:
        if line.find('0/RP1/CPU0    RP(Active)'):
           print("execute command location 0/rp1/cpu0")
        else: 
           if line.find('0/RP0/CPU0    RP(Active)'):
            print("execute command location 0/rp0/cpu0")

, запустив этот скрипт python, просто возвращает меня обратно в приглашение cli, и я не могу получитьдалее, чтобы завершить другой поиск.

CLI $ python test.py CLI $

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Я создал файл, содержащий строки, которые вы искали, и провел некоторое тестирование, и ваш пример должен был дать вам некоторый вывод, хотя и неверный.Это заставило меня задуматься о том, что вы не совсем разбираетесь в скриптах на python, но поправьте меня, если я ошибаюсь.

Чтобы ваша функция была выполнена, вам нужно вызвать ее.Запись def просто определяет это.Вы можете узнать больше об этом здесь .

Я вижу, что вы ищете для этого регулярное выражение, но если в искомой строке нет изменений, вы можете просто использовать find function.

Дело в том, что line.find() возвращает целое число, а не логическое значение.Таким образом, вы всегда вводите первый оператор if, если только ваша строка не начинается с '0/RP1/CPU0 RP(Active)' (так как тогда он будет возвращать индекс 0).Если мы проверим документацию , то увидим, что функция find возвращает -1, если строка не найдена.Таким образом, вы можете изменить выражение if следующим образом: line.find('0/RP1/CPU0 RP(Active)') != -1.То же самое можно сделать с многострочными строками.Единственное, что вам нужно выгрузить весь файл в строку.Поэтому, имея в виду, это решение может решить проблему.

def check_active_rp(activerp):
    whole_file = activerp.read()

    if whole_file.find('0/RP1/CPU0    RP(Active)') != -1:
        print("execute command location 0/rp1/cpu0")
    elif whole_file.find('0/RP0/CPU0    RP(Active)') != -1:
        print("execute command location 0/rp0/cpu0")

    if whole_file.find('INFO_LINE------------------: TITLE_LINE(A-Z)\n  State                              : ENABLED') != -1:
        print('state is ENABLED')
    elif whole_file.find('INFO_LINE------------------: TITLE_LINE(A-Z)\n  State                              : DISABLE') != -1:
        print('restart process on location (FROM SEARCH1)')


with open('sample-output.txt') as active_rp:
    check_active_rp(active_rp)

В вашем примере вы также никогда не закрываете файл, поэтому я использовал оператор с , который считается хорошимпопрактиковаться при работе с IO.

ОБНОВЛЕНИЕ:

Я только что понял, что вы хотели бы изменить то, что написано в информационной строке, в этом случае использование регулярного выраженияподходящее.Тогда будет работать следующее решение:

import re

def check_active_rp(activerp):
    iterator = iter(activerp)
    for line in iterator:
        if line.find('0/RP1/CPU0    RP(Active)') != -1:
            print("execute command location 0/rp1/cpu0")
        elif line.find('0/RP0/CPU0    RP(Active)') != -1:
            print("execute command location 0/rp0/cpu0")

        pattern = re.compile('INFO_LINE------------------: ([A-Z]+)')

        x = pattern.search(line)

        if x:
            line = next(iterator)
            if line.find('ENABLED') != -1:
                print('the {} is ENABLED'.format(x.group(1)))
            elif line.find('DISABLE') != -1:
                print('the {} is DISABLED'.format(x.group(1)))


Итак, мы создаем итератор из файла и начинаем построчно проходить по файлу.Мы все еще используем функцию поиска строки для поиска первой строки.Теперь мы переходим к ИНФОРМАЦИОННОЙ ЛИНИИ.Используя пакет регулярных выражений, мы скомпилируем регулярное выражение, которое бы захватывало TITLE_LINE.Как только это будет найдено, мы получаем следующую строку от итератора и еще раз проверяем, содержит ли строка ENABLED или DISABLE;и напечатайте соответственно.

0 голосов
/ 24 марта 2019

Я думаю, это то, что вы хотите:

def check_active_rp():
   string = '0/RP1/CPU0    RP(Active)'
   for line in activerp:
      if string in line:
         print('execute command location 0/rp1/cpu0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...