#bash #awk
#bash #awk
Вопрос:
Я пытаюсь суммировать результат этого запроса, который принимает коды ошибок HTTP из access.регистрирует и определяет общее количество вхождений для каждого кода:
awk '{print $9}' access.log | sort | uniq -c | sort -rn
Результат:
234 200
3 500
102 404
26 304
3 404
Пытаюсь выяснить, каков наилучший способ суммирования результата (столбца 1 = 234 3 102 26 3)
Спасибо.
Комментарии:
1. Это не тот результат, который я ожидал бы от этой команды, он не отсортирован.
2. Сумма просто
wc -l access.log
3. GNU datamash удобен для такого рода вещей :
datamash -Ws -g9 count 9 < access.log
. Аwc -l access.log
для итога?4. Если бы вы могли публиковать образцы входных данных, то, вероятно, мы могли бы сделать это и в одном awk.
Ответ №1:
Вы можете сделать это с помощью одного решения awk, устраняя необходимость в любом конвейере для сортировки или uniq. Использование GNU awk:
awk '$9 ~ /[[:digit:]]{3}/ { err[$9] =1 } END { PROCINFO["sorted_in"]="@val_num_asc";for (i in err) { tot=tot err[i];print i" - "err[i]} printf "nTOT - %sn",tot }' access.log
Сначала мы проверяем, что 9-е поле, разделенное пробелом, имеет правильный формат для HTTP-кода (3 цифры). Если это так, мы создаем массив с именем err с кодом в качестве индекса, который увеличивается при каждом обнаружении кода. Как только все строки обработаны, мы сортируем массив по значению, числу, порядку возрастания и перебираем записи, печатая код и итог. Мы также устанавливаем текущий итог в переменной tot. Мы, наконец, печатаем этот итог в конце вывода.
Комментарии:
1. Нет проблем. Если вы довольны решением, пожалуйста, примите его как принятый ответ
Ответ №2:
Передайте его другой awk
команде, которая печатает строки и вычисляет общее количество.
awk '{print $9}' access.log | sort | uniq -c | sort -rn | awk '{total = $1; print} END {print total, "Total"}'