Поиск текстовых шаблонов в файле журнала

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

Похоже, вы пытаетесь выполнить полное сопоставление строк, но используете оператор регулярного выражения(~)и динамическое регулярное выражение без границ (pattern), отсюда и ваша проблема.

Избавьтесь от окружающих циклов оболочки и вместо этого просто используйте этот 1 вызов awk:

awk '
    BEGIN { FS=OFS="\t" }
    NR==FNR { genes[$1]; next }
    FNR==1 { fn=FILENAME; sub(/_.*/,"",fn) }
    $4 in genes { out=$4"_out.txt"; print fn, $0 >> out; close(out) }
' listA.txt *hist.txt

0
26.10.2020, 12:57
2 ответа

Это похоже на простой журнал -веб-сервера. Ответ так же прост, как grepи awk.

Пусть файл журнала -имеет имя httpd.log. Вы можете попробовать эту составную команду:

grep -o 'GET \/product\/[^/]*\/' httpd.log |awk 'BEGIN{FS="\/"}{AA[$3]++}END{for(i in AA){print AA[i]" "i}}'|sort -n -r|awk '{print $2","$1}' |head -n20

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

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

Чтобы отфильтровать IP-клиентов, вы можете попробовать самостоятельно, следуя приведенному выше примеру.

1
18.03.2021, 22:54
awk -v pat="GET /product/[0-9]*" -F'[[:blank:]:[]' '
BEGIN           {PROCINFO["sorted_in"]="@val_num_desc"}
$0 ~ pat        {match($0, pat)
                 A[substr($0, RSTART+13, RLENGTH-13)]++}
!C[$5,$1]++     {D[$5]++}
END             {for(i in A){if(++j > 20) break; print i "," A[i]}
                 for(i in D) print i "," D[i]}
' file

BEGIN {PROCINFO["sorted_in"]="@val_num_desc"}-Через элемент массива задайте сортировку по убыванию значения.
$0 ~ pat {match($0, pat);A[substr($0, RSTART+13, RLENGTH-13)]++}-Создание массива с ключами, соответствующими номеру продукта, количество считается в значении.
!C[$5,$1]++ {D[$5]++}-Подсчет уникальных значений. Ключи проверки состоят из даты и IP.
END {for(i in A){ if(++j > 20) break; print i "," A[i]}-Печать первых 20 ключей и значений массива по точке A ).
for(i in D) print i "," D[i]}-Распечатка значений и ключей, отсортированных по значению.

Если вам нужно отсортировать по дате для последней точки, вы можете перенаправить вывод в команду оболочки. Изменить последнюю строку:

for(i in D) print i "," D[i] | "sort -rt\"/\" -k3,3 -k2,2 -k1,1"}
1
18.03.2021, 22:54

Теги

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