Ориентация строки на удаление с помощью grep, sed, awk (или cut) - PullRequest
1 голос
/ 05 июня 2019

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

Следующий шаг - извлечь идентификатор учетной записи из его более длинной строки.Я думал, что это будет довольно просто, так как я буду знать начало строки и есть разделители / слэши, но пользовательский агент также содержит слэши и имеет различное количество полей.

В данный момент файл журнала выглядит как-токак в следующем примере, но есть несколько сотен или тысяч строк для анализа.К счастью, я работаю над разделом с большим количеством свободного места.


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

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Использование grep:

$ grep -o '.*KnownString[^/]*' file
some user agent/1.3     KnownString1_32d4-56e-009f98
user/agent              KnownString1_12d3-345e-4c534
User/Agent cURL/1.5.0   KnownString2_12d34e56
one/User Agent/2.0      KnownString1_12d3_456e_7g8

.* соответствует всему до KnownString, а [^/]* соответствует всему после KnownString до первого /.

0 голосов
/ 05 июня 2019

Вы можете использовать egrep с опцией -o, которая будет выводить только ту часть, которая соответствует указанному регулярному выражению, поэтому вы можете сделать что-то вроде этого

cat test | egrep -o ".+(KnownString1|KnownString2)_[_0-9-]+"

где файл test содержит введенные вами данные, в этом случае вывод был

some user agent/1.3     KnownString1_324-56-00998
user/agent              KnownString1_123-345-4534
User/Agent cURL/1.5.0   KnownString2_123456
one/User Agent/2.0      KnownString1_123_456_78
...