Получение количества комбинаций строк в соответствии с отметкой времени в linux - PullRequest
0 голосов
/ 18 июня 2020

Извините, если топи c не очень понятен, ниже постараюсь пояснить свое требование. У меня есть несколько журналов (на самом деле журналов CDR), которые печатаются каждые 15 минут на моем сервере. в журналах есть CDR (скажем, у него около 20 полей, разделенных запятыми). В cDR также печатается отметка времени. Ниже приведен пример cdr:

20-06-17 10:18:15,1637595323095*33659193263131331794958977243262t31,IVR,*886,724134931,1903-2-1|1901-2-0|1917-5-0|1902-2-0|1908-2-0|1911-5-0|,20-06-17 10:18:16,224,1902-2-0|1908-2-0,,

Я использовал команду ниже, чтобы получить почасовое количество этих строк печати,

cat logfile |grep -a "*886" | cut -d "," -f1 |cut -d ":" -f1 |sort -n |uniq -c

результат был таким, как показано ниже.

18 20-06-14 05
112 20-06-14 06
219 20-06-14 07
279 20-06-14 08
326 20-06-14 09
324 20-06-14 10
271 20-06-14 11
257 20-06-14 12

Так случилось, что мне нужно было проводить счет каждые 15 минут. Есть ли простой способ сделать это?

1 Ответ

0 голосов
/ 18 июня 2020

Во-первых, бесполезное использование cat . Удален один бессмысленный процесс.

Во-вторых, grep/cut/cut можно заменить одним sed или awk. Четыре процесса уменьшились до одного.

Третий - я предполагаю, что вы читаете файл журнала, и первое поле - это временная метка, так что ... разве они уже не были в правильном порядке ??? Без sort не работает корректно? Попытайся. Если это необходимо, оставьте это, но я подозреваю, что это может быть не так, поскольку удален другой процесс. Сорта могут быть дорогими.

В лучшем случае:

 sed -nE '/,*886,/{ s/^([0-9-]{8} [[0-9]{2}):.*/\1/; p; }' file | uniq -c

Это должно быть быстрее. Теперь поместите его в crontab .

*/15 * * * * sed -nE '/,*886,/{ s/^([0-9-]{8} [[0-9]{2}):.*/\1/; p; }' /path/to/logfile | uniq -c >| /path/to/report.tmp; mv /path/to/report.tmp /path/to/report;

Это должно воссоздавать ваш отчет каждые 15 метров.

...