2016-03-22 5 views
0

In additional for my questionВыберите строк по условию с форматированным выводом

Вот пример журнала:

10.10.10.10 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=100&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1" 
10.10.10.10 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=500&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1" 
10.10.10.10 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=100&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1" 
11.11.11.11 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=10&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1" 
12.12.12.12 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=500&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1" 
13.13.13.13 - - [21/Mar/2016:00:00:00 +0000] "GET /example HTTP/1.1" 200 769 "-" "" "1.1.1.1" 

С следующей командой

awk --re-interval '/per_page=[0-9]{3}/{cnt[$1]++} END{for (ip in cnt) print ip, cnt[ip]}' file 

Я посчитан и сгруппирован результатом каждой ведьмой cosist IPs per_page> = 100 в параметрах:

12.12.12.12 1 
10.10.10.10 3 

Как я могу изменить его для вывода с использованием значения параметра per_page? Например (в любом формате):

12.12.12.12 - per_page-500 - 1 
10.10.10.10 - per_page-100 - 2 
10.10.10.10 - per_page-500 - 1 

ответ

2

awk на помощь!

$ awk --re-interval -v OFS=' - ' ' 
    match($0,/per_page=[0-9]{3}/){cnt[$1 OFS substr($0, RSTART,RLENGTH)]++} 
           END{for (ip in cnt) print ip, cnt[ip]}' file 

12.12.12.12 - per_page=500 - 1 
10.10.10.10 - per_page=500 - 1 
10.10.10.10 - per_page=100 - 2 
+0

'{3}' должно быть '{3,}' в случае, если OP имеет значения более 999. –

Смежные вопросы