У меня есть файл журнала, который содержит несколько строк, которые мне нужно захватить:
Jul 2 06:42:00 myhostname error proc[12345]: 01310001:3: event code xxxx Slow transactions attack detected - account id: (20), number of dropped slow transactions: (3)
Jul 2 06:51:00 myhostname error proc[12345]: 01310001:3: event code xxxx Slow transactions attack detected - account id: (20), number of dropped slow transactions: (2)
Идентификатор учетной записи (xx) дает мне имя объекта, который я могу собрать с помощью запроса mysql.
Следующая команда (которая, конечно, вообще не оптимизирована, но работает) дает мне количество совпадающих строк для идентификатора учетной записи:
grep "Slow transactions" logfile| awk '{print $18}' | awk -F '[^0-9]+' '{OFS=" ";for(i=1; i<=NF; i++) if ($i != "") print($i)}' | sort | uniq -c
14 20
Вывод (14 20) означает, что идентификатор учетной записи 20 наблюдался 14 раз (14 строк в файле журнала).
Тогда у меня также есть количество отброшенных медленных транзакций: (2) часть. Это дает реальное количество зарегистрированных отброшенных транзакций. Другими словами, запись в журнале может означать одну или несколько отброшенных транзакций.
У меня есть небольшая команда для подсчета количества отброшенных транзакций:
grep "Slow transactions" logfile | awk '{print $24}' | sed 's/(//g' | sed 's/)//g' | awk '{s+=$1} END {print s}'
73
Это означает, что 73 транзакции были удалены.
Эти две работы, но когда дело доходит до слияния двух, я застрял. Я действительно не понимаю, как их комбинировать; Я почти уверен, что awk может это сделать (и, возможно, лучше, чем я), но я был бы признателен, если бы какой-либо эксперт из сообщества мог дать мне некоторые рекомендации.
обновление Поскольку приведенное выше было слишком просто для некоторых наших экспертов по awk в SO, я добавляю дополнительную функцию :)
Как упоминалось ранее, я могу преобразовать идентификатор учетной записи в имя, выдающее запрос mysql. Итак, теперь идея состоит в том, чтобы включить преобразование ID => name в команду awk.
Запрос mySQL выглядит следующим образом (XX — идентификатор учетной записи):
mysql -Bs -u root -p$(perl -MF5::GenUtils -e "print get_mysql_password.qq{\n}") -e "SELECT name FROM myTABLE where account_id= 'XX'"
Я основал сообщение ниже, в котором речь идет о выводе команд в awk, но с синтаксическими ошибками...