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