Скрипт Bash, который считает идентификаторы в квадратных скобках каждые десять минут - PullRequest
0 голосов
/ 18 сентября 2018

Имея этот файл журнала

20180917084726:-
20180917085418:[111783178, 111557953, 111646835, 111413356, 111412662, 105618372, 111413557]
20180917115418:[111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281]
20180917105419:[111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281]
20180917085522:[111344871, 111394583, 111295547, 111379566, 111352520]
20180917090022:[111344871, 111394583, 111295547, 111379566, 111352520]

Формат журнала ввода:

метка времени в формате ГГГГММДДччммсс

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

Результат такой:

20180917084:0
20180917085:12
20180917115:7
20180917105:7

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

ваш ввод и вывод не согласованы, но я думаю, вы хотите что-то вроде этого

 $ awk -F: '{k=sprintf("%10d",$1/1000); n=gsub(",",",",$2); a[k]+=(n?n+1:n)} 
        END {for(k in a) print k":"a[k] | "sort" }' file 

20180917084:0
20180917085:12
20180917090:5
20180917105:7
20180917115:7
0 голосов
/ 18 сентября 2018

awk: в качестве разделителя полей используется двоеточие или запятая.

awk -F '[,:]' '
    {
        key = substr($1,1,11)"0"
        count[key] += ($2 == "-" ? 0 : NF-1)
    } 
    END {
        PROCINFO["sorted_in"] = "@ind_num_asc"
        for (key in count) print key, count[key]
    }
' file
201809170840 0
201809170850 12
201809170900 5
201809171050 7
201809171150 7

Чтобы выполнить фильтрацию по текущей дате, вы можете сказать:

gawk -F '[,:]' '
    BEGIN {today = strftimme("%Y%m%d", systime())}
    $0 ~ "^"today { key = ...

или

awk -F '[,:]' -v "today=$(date "+%Y%m%d")" '
    $0 ~ "^"today { key = ...

или передайте существующий код awk на | grep "^$(date +%Y%m%d)"

0 голосов
/ 18 сентября 2018

Не могли бы вы попробовать следующее, это даст вам вывод в том же порядке, в котором в метке времени происходит вхождение отметки времени.

awk '
{
  val=substr($0,1,11)
}
!a[val]++{
  b[++count]=val
}
match($0,/\[.*\]/){
  num=split(substr($0,RSTART,RLENGTH),array,",")
  c[val]+=num
}
END{
  for(i=1;i<=count;i++){
    print b[i],c[b[i]]+0
  }
}'   Input_file

Вывод будет следующим.

20180917084 0
20180917085 12
20180917115 7
20180917105 7
20180917090 5

РЕДАКТИРОВАТЬ: Добавление решения на случай, если любое из ваших полей имеет значение NULL, поэтому установите код выше, код тоже сейчас.

awk '
{
  val=substr($0,1,11)
}
!a[val]++{
  b[++count]=val
}
match($0,/\[.*\]/){
  count1=""
  num=split(substr($0,RSTART,RLENGTH),array,",")
  for(j=1;j<=num;j++){
    if(array[j]){
      count1++
    }
  }
  c[val]+=count1
}
END{
  for(i=1;i<=count;i++){
    print b[i],c[b[i]]+0
  }
}'  Input_file
0 голосов
/ 18 сентября 2018

Perl в помощь!

perl -ne '
    ($timestamp, @ids) = /([0-9]+)/g;
    substr $timestamp, -3, 3, "";
    @{ $seen{$timestamp} }{@ids} = ();
    END {
        for my $timestamp (sort keys %seen) {
            print "$timestamp:", scalar keys %{ $seen{$timestamp} }, "\n";
        }
    }' < file.log
  • -n читает строку ввода строкой
  • substr здесь заменяет последние три символавременная метка с пустой строкой
  • %seen - это хэш хэшей, для каждой временной метки внутренний хэш записывает, какие идентификаторы были видны
  • ключи в скалярном контексте возвращают счетключей, в этом случае количество уникальных идентификаторов на отметку времени.
...