Добавление результата столбца на основе awk

#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"}'