#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