Как считать строки в документе с конкретным словом + вывести к ним дату из строки?
У меня есть файл с примерно таким содержанием
2011-10-12 14:22:44 OK
2011-10-12 16:11:41 OK
2012-02-11 14:12:31 OK
2015-05-05 03:17:11
2015-08-06 12:11:31
2020-07-07 11:17:51 OK
2020-05-08 14:15:21
Мне нужно взять и посчитать количество строк с выводом "ОК" (их всего 4) в конкретный день. То есть вывод должен быть примерно таким:
2011-10-12 2
2012-02-11 1
2015-05-05 0
2015-08-06 0
2020-07-07 1
2020-05-08 0
Как грепать и считать сколько всего строк с OK, я понимаю, а вот как еще и дату к этому вывести,не понимаю.
Вот что у меня есть
for i in `cat $1 | grep "OK" | wc -l`
do
echo $i
done
Ответы (2 шт):
Вообще для таких целей существуют популярные специализированные системы для визуализации логов. Вроде, Kibana так должна уметь. Стоит это помнить, когда самописные скрипты будут усложняться.
Предложу в качестве идеи совершенно примитивное и быстрое решение.
Решение основано на ответе с enSO, где используется такая утилита q от пользователя harelba на github.com, которая позволяет делать SQL-запросы к CSV файлу.
$ cat example.log | q -d ' ' "SELECT c1, COUNT(CASE WHEN c3='OK' THEN 1 END) FROM - GROUP BY 1"
2011-10-12 2
2012-02-11 1
2015-05-05 0
2015-08-06 0
2020-05-08 0
2020-07-07 1
Я сохранил приведенный пример данных в файл example.log и получилось его интерпретировать как CSV-файл с тремя колонками (c1...c3), где разделителем выступает пробел (-d ' ').
Это довольно простой скрипт на Awk:
{
if ($3 == "OK") {
a[$1]++;
} else {
a[$1] = 0;
}
}
END {
for (i in a) {
print i " " a[i];
}
}
awk -f ./tmp.awk ./tmp.txt
2020-05-08 0 2015-08-06 0 2020-07-07 1 2012-02-11 1 2011-10-12 2 2015-05-05 0
Можно даже однострочником:
$ awk '{$3=="OK"?a[$1]++:a[$1]=0}END{for(i in a)print(i,a[i])}' ./tmp.txt