Используйте AWK для сравнения времени в столбце

Есть несколько проблем, связанных с вашей попыткой. Непосредственная проблема заключается в использовании rhoв качестве буквальной строки при повышении ее как степенной константы доbc

bc <<<"$j ^ $rho"

Даже при этом код не работает, bcне принимает дробные числа в качестве показателей степени. Выдает ошибку non-zero scale in exponent.

Вы можете использовать awk(, проверенный на варианте GNU ), для того же и применить форматирование с той же точностью, что и

awk -v base="$j" -v xp="$rho" 'BEGIN{ printf "%.20f", base ** xp }'
2
04.11.2020, 22:20
1 ответ

Простой, -метод грубой силы, который считывает все ваши IP-адреса и метки времени после преобразования в секунды эпохи в память (массив secs[]), а затем, как только весь файл будет прочитан, циклически перебирает массив по одному IP-адресу за раз, просматривая разницу в метках времени каждые 5 записей, чтобы увидеть, есть ли какие-либо из них менее 15 секунд:

$ cat tst.awk
BEGIN { FS="|" }
{
    split($1,t,"[/:]")
    monthNr = (index("JanFebMarAprMayJunJulAugSepOctNovDec",t[2])+2)/3
    currSecs = mktime(t[3] " " monthNr " " t[1] " " t[4] " " t[5] " " t[6])

    secs[$2][++count[$2]] = currSecs
}
END {
    range = 5
    for (ip in secs) {
        for (beg=1; beg<=(count[ip]-range)+1; beg++) {
            end = beg + range - 1
            if ( (secs[ip][end] - secs[ip][beg]) < 15 ) {
                print ip
                break
            }
        }
    }
}

$ awk -f tst.awk file
000.000.000.016
000.000.000.017

Это означает, что вам нужно иметь достаточно памяти для хранения списка IP-адресов и секунд эпохи, но ваш файл должен состоять из огромных (миллиардов строк ), чтобы это стало проблемой.


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

$ awk -F'|' '
    {
        split($1,t,"[/:]")
        monthNr = (index("JanFebMarAprMayJunJulAugSepOctNovDec",t[2])+2)/3
        currSecs = mktime(t[3] " " monthNr " " t[1] " " t[4] " " t[5] " " t[6])

        print currSecs, NR, $0
    }
' log-file.csv | sort -k1,1n -k2,2n | cut -d' ' -f3- > sorted-log-file.csv

, а затем запустите приведенный выше скрипт на THAT, чтобы получить следующие 50 IP-адресов:

$ awk -f tst.awk sorted-log-file.csv | sort
000.000.000.011
000.000.000.017
000.000.000.036
000.000.000.056
000.000.000.066
000.000.000.094
000.000.000.115
000.000.000.121
000.000.000.136
000.000.000.141
000.000.000.157
000.000.000.169
000.000.000.178
000.000.000.181
000.000.000.183
000.000.000.208
000.000.000.227
000.000.000.230
000.000.000.283
000.000.000.312
000.000.000.354
000.000.000.361
000.000.000.368
000.000.000.370
000.000.000.505
000.000.000.515
000.000.000.579
000.000.000.580
000.000.000.588
000.000.000.610
000.000.000.634
000.000.000.642
000.000.000.651
000.000.000.748
000.000.000.756
000.000.000.758
000.000.000.772
000.000.000.795
000.000.000.814
000.000.000.852
000.000.000.878
000.000.000.882
000.000.000.922
000.000.000.994
000.000.000.995
000.000.001.047
000.000.001.119
000.000.001.139
000.000.001.185
000.000.001.198
3
18.03.2021, 22:52

Теги

Похожие вопросы