Я пытаюсь проанализировать некоторые журналы, чтобы получить агента пользователя и идентификатор учетной записи в строке.Мне уже удалось вытащить пользовательский агент и строку, содержащую идентификатор учетной записи, все в одной строке.
Следующий шаг - извлечь идентификатор учетной записи из его более длинной строки.Я думал, что это будет довольно просто, так как я буду знать начало строки и есть разделители / слэши, но пользовательский агент также содержит слэши и имеет различное количество полей.
В данный момент файл журнала выглядит как-токак в следующем примере, но есть несколько сотен или тысяч строк для анализа.К счастью, я работаю над разделом с большим количеством свободного места.
USER_AGENT_PART ACCOUNT_ID_Part_/plus/path/to/stuff/they/access
some user agent/1.3 KnownString1_32d4-56e-009f98/some/stuff/here
user/agent KnownString1_12d3-345e-4c534/more/stuff/here
User/Agent cURL/1.5.0 KnownString2_12d34e56/stuff/things/stuff/stuff
one/User Agent/2.0 KnownString1_12d3_456e_7g8/more/random/stuff/stuff
Таким образом, цель состоит в том, чтобы оставить часть пользовательского агента и часть идентификатора учетной записи и отбросить путь, к которому они обращаются, впоследняя строкаНо я не могу использовать / или пробелы в качестве общих разделителей, потому что многие пользовательские агенты имеют / и различное количество пробелов в своем имени.
Кроме того, различные типы пользовательских агентов намного больше, чем этот небольшой пример, который я имею здесь.Существует от 25 до 50 различных типов в зависимости от журнала.Так что, кажется, не стоит нацеливаться на пользовательский агент и пытаться исключить его.
Кажется, что логичный способ начать с нацеливания на часть идентификатора учетной записи, которая является известной строкой (KnownString1 или KnownString2) и возьмите все оттуда (неизвестные цифры и буквы с тире) до первой строки этой учетной записи.
Тогда я бы удалил первый / (в строке идентификатора учетной записи) и все после.Я ожидаю, что мне нужно будет сделать это за два прохода, чтобы использовать две известные части идентификаторов пользователей.
Казалось бы, это будет легко, но я просто не могу понять, как начать нацеливание на это.последняя строкаУ меня даже нет хорошего примера того, что близко к работе, потому что я не знаю, как нацелить последнюю строку с помощью разделителей, не перехватывая те же разделители в части пользовательского агента.
Есть идеи?
Редактировать: каждая строка будет иметь идентификатор учетной записи, который начинается с одной из двух общих KnownString_, но затем следует серия неизвестных цифр и тире, пока не дойдет до первой /.Поэтому мне не нужно искать строки, содержащие эту строку, до нацеливания на строку.
Edit2: в моих исходных примерах идентификатора учетной записи не отражались буквы, смешанные с цифрами.
Edit3: Благодаря ответам от oguz ismail и kesubagu я смог решить эту проблему с помощью egrep.Похоже, я пытался сделать вещи сложнее, чем они.Я также понял, что мне нужно вернуться к grep, поскольку он способен делать гораздо больше, чем то, для чего я склонен его использовать.
Это то, что я в итоге использовал, которое сработало за один проход:
egrep-o ". + (KnownString1 | KnownString2) _ [^ /] +" logfile> logfile2