Большой grep из списка txt в логах файла .gz - PullRequest
0 голосов
/ 28 февраля 2019

это моя проблема (для меня на самом деле большая проблема).

У меня есть текстовый файл с 1.130.395 строками, как показано в примере ниже:

10812
10954
10963
11070
11099
10963
11070
11099
betti.bt
betti12
betti1419432307
19442407
19451970
19461949

у меня как 2000Файлы журнала .gz.

Мне нужно, чтобы для каждой строки файла .txt выполнялся grep для всех файлов .gz.

Это пример содержимого файлов gz,пример строки:

time=2019-02-28 00:03:32,299|requestid=30ed0f2b-9c44-47d0-abdf-b3a04dbb560e|severity=INFO |severitynumber=0|url=/user/profile/oauth/{token}|params=username:juvexamore,token:b73ad88b-b201-33ce-a924-6f4eb498e01f,userIp:10.94.66.74,dtt:No|result=SUCCESS
time=2019-02-28 00:03:37,096|requestid=8ebca6cd-04ee-4818-817d-30f78ee95731|severity=INFO |severitynumber=0|url=/user/profile/oauth/{token}|params=username:10963,token:1d99be3e-325f-3982-a668-30494cab9a96,userIp:10.94.66.74,dtt:No|result=SUCCESS

TXT-файл содержит имя пользователя.Мне нужно искать в файлах gz, если в имени пользователя присутствует URL с параметрами "profile" и "result = SUCCESS".

, если что-то найдено, записывать только в файл журнала: username found; name of the log file in which it was found

Можно что-то сделать?Я знаю, что мне нужно использовать команду zgrep, но может ли кто-нибудь мне помочь .... есть ли возможность автоматизировать процесс, чтобы он ушел?

Спасибо всем

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я бы просто сделал (не проверено):

zgrep -H 'url=/user/profile/oauth/{token}|params=username:.*result=SUCCESS' *.gz |
awk -F'[=:,]' -v OFS=';' 'NR==FNR{names[$0];next} $12 in names{print $12, $1}' names.txt - |
sort -u

или, возможно, немного более эффективно, поскольку он удаляет тест NR==FNR для каждого вывода строки с помощью zgrep:

zgrep -H 'url=/user/profile/oauth/{token}|params=username:.*result=SUCCESS' *.gz |
awk -F'[=:,]' -v OFS=';' '
    BEGIN {
        while ( (getline line < "names.txt") > 0 ) {
            names[line]
        }
        close("names.txt")
    }
    $12 in names{print $12, $1}' |
sort -u

Если данное имя пользователя может появиться только один раз в данном файле журнала или если вы действительно хотите, чтобы несколько вхождений создавали несколько выходных строк, вам не нужен последний | sort -u.

0 голосов
/ 28 февраля 2019

Переписать, используя getline.Он читает и хэширует file.txt имена пользователей, затем копирует gzips, заданные в качестве параметров, split s до тех пор, пока не получит поле с username:, извлекает фактическое имя пользователя и ищет его из хэша.Не проверено должным образом и т. Д. И т. Д. Стандартный отказ от ответственности.Дайте мне знать, если это сработало:

$ cat script.awk
BEGIN{
    while (( getline line < ARGV[1]) > 0 ) {       # read the username file
        a[line]                                    # and hash to a
    }
    close(ARGV[1])
    for(i=2;i<ARGC;i++) {                          # read all the other files
        cmd = "gunzip --to-stdout " ARGV[i]        # form uncompress command
        while (( cmd | getline line ) > 0 ) {      # read line by line
            m=split(line,t,"|")                    # split at pipe
            if(t[m]!="result=SUCCESS")             # check only SUCCESS records
                continue
            n=split(t[6],b,/[=,]/)                 # username in 6th field
            for(j=1;j<=n;j++)                      # split to find it, set to u var:
                if(match(b[j],/^username:/)&&((u=substr(b[j],RSTART+RLENGTH)) in a)) {
                    print u,"found in",ARGV[i]     # output if found in a hash
                        break                      # exit for loop once found
                }
        }
        close(cmd)
    }
}

Запустите его (используя 2 копии одинаковых данных):

$ awk -f script.awk file.txt log-0001.gz log-0001.gz
10963 found in log-0001.gz
10963 found in log-0001.gz
...