Как извлечь строку в кавычках в файле журнала с разделителями - PullRequest
0 голосов
/ 08 марта 2019

Я надеюсь, что может быть какой-то простой способ сделать это, так как я новичок в использовании awk.

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

Проверка кода ответа достаточно проста, я могу сделать следующее ...

$9=="403" {print $0}

Однако, что мне действительно нужно, так это сам запрос, $ 13. Однако этот столбец заключен в кавычки и будет содержать пробелы. Похоже, что так ...

"GET https://[my domain name]:443/[my path] HTTP/2.0"

Если я сделаю следующее ...

$9=="403" {print $13}

Я просто получаю ...

"GET

Так что я думаю, что мне нужно сделать, чтобы awk (или какая-то другая соответствующая утилита) извлекла полный столбец 13, а затем смогла разбить его на отдельные поля, для метода, URL и т. Д.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

более новая версия gawk имеет встроенную переменную FPAT, которую можно использовать для определения полей с помощью шаблона регулярных выражений. Для ваших журналов, если нет других цитируемых полей перед полями 9 и 13:

awk -v FPAT='[^[:space:]]+|"[^"]*"' '$9 == "403"{print $13}' log_file

REF: https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html

0 голосов
/ 08 марта 2019

Не могли бы вы попробовать следующее.Я дал внутреннее регулярное выражение match 443 согласно вашему образцу, чтобы соответствовать ему, вы можете дать его согласно вашей необходимости искать 403 и изменить его на match($0,/\".*403.*\"/).

awk 'match($0,/\".*443.*\"/){print substr($0,RSTART,RLENGTH)}'  Input_file

ИМХО преимуществопри таком подходе вам НЕ нужно жестко кодировать номер поля в вашем awk.Еще 1 вещь, которую я предположил, что ваш Input_file будет иметь вид "......403....." вида только один раз, и вы хотите напечатать только это.

1 больше дополнительных awk, где я предполагаю, что у вас может быть несколько вхождений "..." поэтому выбираем только тот, куда 403|443 придет.

awk 'match($0,/\".*443[^"]*/){print substr($0,RSTART,RLENGTH+1)}' Input_file


РЕДАКТИРОВАТЬ: Или, если ваш Input_file имеет "...443..." один раз или этот текст идет первым после начала строки (при условии, что другие вхождения ".." появятся позже), тогда вы можете попробовать выполнить следующее.

awk -F'"' '/443/{print $2}' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...