Найти совпадение в строке файла, затем перейти к следующему файлу - PullRequest
0 голосов
/ 23 июня 2018

Я новичок в python, и я пытаюсь написать скрипт для циклического прохождения всех файлов .txt в моем / home каталоге и перебора строк в каждом файле .txt и посмотреть, могу ли я найти совпадение, если оно делает, он должен перейти к следующему файлу. Если он не находит совпадения во всем файле, сообщите об этом.

Код, который у меня есть:

strname = "ntpq -p"

for file in glob.glob("/home/xxx/*.txt"):
    with open(file, 'rb') as f:
        iFoundTheLine = 0
        for line in f:
            line = line.rstrip()
            id = line.split(b"|")[0]

            if strname in line:
                iFoundTheLine = 1
                print ("%s is ok" % id)
                break

        if iFoundTheLine == 0:
            print ("Problem with NTP%s" % id)

Результат, который я получил:

srv29393 в порядке

Проблема с NTP

srv29494 в порядке

Проблема с NTP

srv29399 в порядке

srv29493 в порядке

Ожидаемый результат, который я ищу:

srv29393 в порядке

Проблема с NTP srv1234

srv29494 в порядке

Проблема с NTP srv2345

srv29399 в порядке

srv29493 в порядке

образцы строк:

srv29393 | 23.06.18 | 05: 32: 02 | ps -eo user, pid, ppid, start, etimes, cmd | egrep -v [\ w <|> nobody 22972 21597 03:06:12 8767 (dnsserver)

srv29393 | 23.06.18 | 05: 32: 02 | 1529746322 | ps -eo user, pid, ppid, start, etimes, cmd | egrep -v [\ w <|> nobody 22973 21597 03:06:12 8767 (dnsserver)

srv29393 | 23.06.18 | 05: 32: 02 | ps -eo user, pid, ppid, start, etimes, cmd | egrep -v [\ w <|> nobody 22974 21597 03:06:12 8767 (dnsserver)

srv29393 | 23.06.18 | 05: 32: 02 | 1529746322 | / usr / sbin / ntpq -p <|> * 1.1.1.11 11.11.11.11 3 u 1055 1024 377 719,042 -0,625 0,016

srv29393 | 23.06.18 | 05: 32: 02 | 1529746322 | / usr / sbin / ntpq -p <|> +2.2.2.11 12.12.12.11 3 u 1049 1024 377 824,784 0,707 0,121

Пропущен "id" для тех, у кого проблема с NTP. Может ли кто-нибудь помочь / посоветовать?

1 Ответ

0 голосов
/ 23 июня 2018

У вас есть небольшая проблема. Вы пытаетесь напечатать id вне цикла for, где id недоступен. Таким образом, он должен быть размещен внутри цикла.

Кроме того, по этой причине нет причины, по которой у вас должна быть переменная iFoundTheLine, так как она не нужна.

РЕДАКТИРОВАТЬ: for line in f должно быть for line in f.readlines()

С некоторым рефакторингом вашего кода:

import glob
strname = "ntpq -p"

for File in glob.glob("/home/xxx/*.txt"):
    with open(File, 'r', encoding='utf-8') as f:
        for line in f.readlines():
            line = line.rstrip()
            id = line.split("<|>")[0]

            if strname in line:
                print ("%s is ok" % id)
                break

            else:
                # Since, `id` is accessible inside the loop 
                print ("Problem with NTP%s" % id)

Поскольку текстовый файл содержит специальные символы, я рекомендую использовать кодировку UTF-8 с файлом вместо доступа к нему в двоичном формате, поскольку это облегчает взаимодействие с файлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...