Найдите совпадение в строке файла, затем перейдите к следующему файлу

1

Я новичок в python, и я пытаюсь написать скрипт, чтобы перебирать все.txt файлы в моем/домашнем каталоге и перебирать строки в каждом.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 | 06/23/18 | 05: 32: 02 | ps -eo пользователь, pid, ppid, start, etimes, cmd | egrep -v [\ w <|> nobody 22972 21597 03:06:12 8767 (dnsserver)

srv29393 | 06/23/18 | 05: 32: 02 | 1529746322 | ps -eo пользователь, pid, ppid, start, etimes, cmd | egrep -v [\ w <|> nobody 22973 21597 03:06:12 8767 (dnsserver)

srv29393 | 06/23/18 | 05: 32: 02 | ps -eo пользователь, pid, ppid, start, etimes, cmd | egrep -v [\ w <|> nobody 22974 21597 03:06:12 8767 (dnsserver)

srv29393 | 06/23/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

-p <|> +2.2.2.11 12.12.12.11 3 u 1049 1024 377 824.784 0.707 0.121

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

Теги:
python-2.7

1 ответ

1

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

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

EDIT: 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 с файлом, а не обращаться к нему в двоичном формате, поскольку это облегчает взаимодействие с файлом.

  • 0
    Разве это не весь смысл?
  • 0
    Я попробовал это, и это не работает
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню