Как мне отфильтровать определенный текст с помощью awk, но также распечатать текст? - PullRequest
1 голос
/ 01 августа 2020

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

Вот пример исходного текста, который я пытаюсь фильтровать. Я не могу вставить сюда весь журнал или вывод, потому что он очень длинный, но я могу предоставить его здесь: Если это поможет кому-то, вот полный журнал, обратите внимание, что не все данные такие же, как остальные, несколько строк разные, но я готов вручную отфильтровать несколько строк, которые не соответствуют остальным: https://pastebin.com/ifVK2BHg

[16:07:29] [Server thread/INFO]: OkqySeany lost connection: Disconnected
[16:24:42] [Server thread/INFO]: DraconicPiggy lost connection: Disconnected
[19:35:49] [User Authenticator #8/INFO]: UUID of player Anviloh_YT is 009fd2cd-c5da-4639-b3b9-ef90b7438c99
[19:39:43] [User Authenticator #9/INFO]: UUID of player DraconicPiggy is b075ce61-dcef-4d40-a674-100a07b361c4
[20:16:00] [Server thread/INFO]: Anviloh_YT lost connection: Disconnected
[20:19:57] [Server thread/INFO]: DraconicPiggy lost connection: Disconnected

Команда, которая выводит поле $ 4, но также имеет #INFO на нем:

    awk '{print $1 "\t" $4 "\t" $8 }' *.filtered.log
[16:07:29] OkqySeany  
[16:24:42] DraconicPiggy  
[19:35:49] #8/INFO]: Anviloh_YT  
[19:39:43] #9/INFO]: DraconicPiggy  
[20:16:00] Anviloh_YT  
[20:19:57] DraconicPiggy  

Поле 4 содержит некоторые данные, которые мне нужны, но #INFO - это то, что я хочу удалить, поэтому я попробовал это:

    awk '$4 !~ /#/ {print $1 "\t" $4 "\t" $8 }' *.filtered.log

Но эта команда просто удаляет нужное мне поле:

[16:07:29]      OkqySeany  
[16:24:42]      DraconicPiggy  
[20:16:00]      Anviloh_YT  
[20:19:57]      DraconicPiggy  

Как вы видите, 2 в середине исчезли, как мне удалить #INFO, не удаляя всю строку? Я пытаюсь получить такой результат:

[16:07:29] OkqySeany  
[16:24:42] DraconicPiggy  
[19:35:49] Anviloh_YT  
[19:39:43] DraconicPiggy  
[20:16:00] Anviloh_YT  
[20:19:57] DraconicPiggy  

Ответы [ 3 ]

0 голосов
/ 01 августа 2020

Используйте функции substr () и match ()

Вам нужно преобразовать #4/INFO]: в #4, т.е. удалить последние 7 символов. Строки "Sever thread" предназначены для отключений и не содержат поля #.

Отключения немного сложно обрабатывать, поскольку существует две версии отключения:

  1. …iHezi lost connection: Disconnected
  2. …com.mojang…authlib.GameProfile@6c2ffd3b[id=<null>,name=GLX27,properties=…

Скрипт

Создайте файл с именем test.awk, содержащий:

$2 != "[Server" {
  slashPos = index($4, "/" )
  if ( slashPos > 0 ) {
    cleanField4 = substr( $4, 1, slashPos - 1 )
  } else {
    cleanField4 = $4
  }
  print "B" NR,$1 "\t\t" cleanField4 "\t" $8
  next
}

"lost connection" {
  if ( index( $0, "id=<null>" ) > 0 ) {
    match( $4, /name=\y(.+)\y,properties/, array )
    $4 = array[1]
    $7 = $NF
  }
  print $1 "\t" $7 "\t" $4
}

Командная строка

Чтобы использовать это из командной строки, измените вашу команду на:

awk -f test.awk *.filtered.log

Вывод из сценария с использованием последних данных образца

Это только первые несколько строк сформированный отчет:

[04:25:32]              #1      DraconicPiggy
[04:27:46]      Disconnected    DraconicPiggy
[04:27:52]              #2      DraconicPiggy
[05:01:01]              #3      Myshiro
[05:03:08]              #4      deathweek
[05:06:08]      Disconnected    deathweek
0 голосов
/ 02 августа 2020

Судя по образцу данных, похоже, что выходные данные должны включать 1 строку вывода на 1 строку ввода (timestmap и userid), и что есть два «типа» строк («Server» и «User»), где идентификатор пользователя находится в разных позициях в каждой строке.

Рассмотрим следующий awk скрипт

awk '
$2 == "[Server" { print $1, $4 ; next }
$2 == "[User" { print $1, $8 ; next }
' *.filtered.log
0 голосов
/ 01 августа 2020

Не уверен, что вы имеете в виду под полями, но в примере данных, которые вы публикуете, вы хотите пропустить вторую группу в квадратных скобках (логически поле 2) и вывести первое слово из логического поля 3 (похоже на строку журнала). Однако не удалось определить значение поля 8.

Могут быть две интерпретации

После удаления второго логического поля выведите первое слово и еще одно слово

$ awk -v OFS='\t' '{sub(/ \[[^]]+\]/,""); print $1,$2,$6}' file

[05:03:08]:     UUID    is
[05:06:08]:     deathweek

Или выведите первое и последнее слово из строки журнала

$ awk -v OFS='\t' '{sub(/ \[[^]]+\]/,""); print $1,$2,$NF}' file

[05:03:08]:     UUID    50c4aed1-900f-4397-b8ac-73b232df90fc
[05:06:08]:     deathweek       Disconnected

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...