Уникальные строки Python в файле и разрыв строки - PullRequest
0 голосов
/ 23 сентября 2019

Я работаю над созданием синтаксического анализатора журнала на основе сценария стиля командной строки, который выводит совпадение.Идея состоит в том, чтобы выводить в журнал только уникальные строки, которые соответствуют нескольким уникальным значениям.Ниже приведен пример формата уникального извлечения.

From source books, query: ((domain:www.users.com || username:ed || location:boston || years:2 || title:lead || last_update:{2019-09-19T16:44:36.153Z TO 2019-09-19T16:48:04.125Z] && userid_17:*).
From source books, query: ((domain:www.users.com || username:john || location:austin || years:1 || title:associate || last_update:{2019-09-19T16:44:40.133Z TO 2019-09-19T16:48:06.145Z] && userid_18:*).

Среди других строк эти строки уникальны тем, что имеют userid_, domain и years.Если эти 3 не в строке, они не должны отображаться.

Новая строка будет записываться в журнал каждые 10 минут с обновленной отметкой времени last_update.Мне нужен только первый удар по этому идентификатору пользователя.В моем сценарии я удалил временную метку между {], фактически делая линии одинаковыми, чтобы было легче вытягивать уникальную линию.

В настоящее время мой сценарий «работает», но я уверен, что его можно почистить и надеяться на идеи.Я все еще очень новичок в написании сценариев на Python, так что критикуйте.Прямо сейчас разрыв строки не работает, и я чувствую, что это будет визуально легче увидеть.

Я также чувствую, что userid_ будет лучше для уникальных, но я не знал, как сказать, найти это уникальное значение один раз, но также должен иметь поиск 2 и 3.

Критерии:

  • Уникальный вывод, должна быть напечатана только одна строка userid_ для каждого идентификатора
  • , и годы являются уникальными для этого поиска, другие строки, содержащие userid_ без этих двух совпадений, печатать не нужно
  • Должен иметь разрыв строки после каждой уникальной находки, чтобы облегчить чтение.

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

import os, sys, argparse, urllib.parse, csv, re

parser = argparse.ArgumentParser(description='Choose an option')

# Setup required arguments
parser.add_argument('-b', action="store_true", help='searches users with domain and years')
args = parser.parse_args()

#Get Current Working Directory
dirpath = os.getcwd()

if args.b:
        debug_log = dirpath+'/var/log/database/debug.log'
        # 3 items are unique to this line vs other similar "userid_" lines 
        search1="userid_"
        search2="domain"
        search3="years"
        with open(debug_log, 'r') as search:
                unique = set()
                for lines in search:
                        #search the file for matching terms
                        if search1 and search2 and search3 in lines:
                                #remove the last_update items, anything between { and ] to make it unique
                                removed = re.sub(r'\{(.*?)\]', '', lines)
                                if removed not in unique:
                                        unique.add(removed)
                print(unique)

Вывод этого скрипта получается, как показано ниже, поэтому он работает.Однако разрыв строки отсутствует, хотя в выводе есть \ n.Я предполагаю, потому что набор используется?Когда есть более 50 попаданий, вывод одной строки становится труднее читать.

{'From source books, query: ((domain:www.users.com || username:ed || location:boston || years:2 || title:lead || last_update: && userid_17:*).\n', 'From source books, query: ((domain:www.users.com || username:john || location:austin || years:1 || title:associate || last_update: && userid_18:*).\n'}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Вместо того, чтобы печатать строковое значение набора unique, вы хотите распечатать каждую строку в наборе.

То есть измените

print(unique)

на

for line in unique:
    print(line, end='')

(Это будет работать в Python 3, который, похоже, вы используете.)

(end='' есть, потому что каждый line заканчивается новой строкой, ипо умолчанию print также добавляет символ новой строки. Вам не нужны оба.)

0 голосов
/ 23 сентября 2019

Это не элегантно, и на самом деле не отвечает "почему", но если вам просто нужно продолжить свою жизнь, вы можете попробовать добавить свой собственный '\ n', как в:

if removed not in unique:
     unique.add(removed + '\n')

К сожалению, так работает Я : /

...