awk — Как извлечь строку в кавычках из файла журнала, разделенного пробелом

#awk

#awk

Вопрос:

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

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

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

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

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

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

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

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

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

 "GET
  

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

Комментарии:

1. можете ли вы добавить образец всей строки журнала

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее. Я привел внутреннее регулярное выражение 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
  

Комментарии:

1. @user1751825, не могли бы вы, пожалуйста, сообщить мне здесь, помогло ли вам это решение?

Ответ №2:

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

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

ССЫЛКА: https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html