2015-04-21 2 views
3

У меня есть большой файл, полный линий, как это ...Подсчитайте наиболее распространенные вхождения неизвестных строк в файл

19:54:05 10.10.8.5 [SERVER] Response sent: www.example.com. type A by 192.168.4.5 
19:55:10 10.10.8.5 [SERVER] Response sent: ns1.example.com. type A by 192.168.4.5 
19:55:23 10.10.8.5 [SERVER] Response sent: ns1.example.com. type A by 192.168.4.5 

Я не заботиться о каком-либо других данных, только то, что после того, как «response sent:» Мне нужен отсортированный список наиболее распространенных вхождений доменных имен. Проблема в том, что я не буду знать все имена доменов заранее, поэтому я не могу просто выполнить поиск строки.

Используя пример выше, я хотел бы выход быть вдоль линий

ns1.example.com (2) 
www.example.com (1) 

... где число в скобках() отсчеты этого события.

Как я могу использовать это для Windows? Входной файл - .txt - выходной файл может быть любым. В идеале это процесс командной строки, но я действительно потерялся, поэтому я был бы доволен чем угодно.

+1

Я _really_ хочет помочь вам, но я боюсь, ваш вопрос не вверх к стандартам SO. Это читается как вопрос, связанный с кодами. Вы что-то пробовали? – Matt

+0

Я пробовал несколько вариантов параметров командной строки grep, основываясь на других вопросах, которые я нашел в stackoverflow, но, честно говоря, кодирование - это не моя дневная работа, мне просто дали это после того, как кто-то ушел - то, что я всегда нашел, входная поисковая строка (чтобы быть известна) - поэтому я попытался взять файл выше, отсортировать его в excel, чтобы удалить лишний материал, а затем запустить grep по всему для каждого из доменов, но это слишком медленно/вручную - я понял, что там должен быть лучшим способом. – notAduck

ответ

3

Кошка из своего мешка, поэтому попробуйте немного помочь. Это решение PowerShell. Если у вас возникли проблемы с тем, как это работает, я рекомендую вам исследовать отдельные части.

Если вы текстовый файл был «D: \ temp \ test.txt», тогда вы можете сделать что-то вроде этого.

$results = Select-String -Path D:\temp\test.txt -Pattern "(?<=sent:).+(?= type)" | Select -Expand Matches | Select -Expand Value 
$results | Group-Object | Select-Object Name,Count | Sort-Object Count -Descending 

Использование входа вы получите для вывода

Name    Count 
----    ----- 
ns1.example.com.  2 
www.example.com.  1 

Поскольку существует регулярное выражение я спасенный link that explains how it works.

Пожалуйста, имейте в виду, что SO - это, конечно же, сайт, который помогает программистам и энтузиастам по программированию. Мы посвящаем наше свободное время, когда некоторым людям платят за это.

+0

Видимо, я слишком молод на этом сайте, чтобы продвигаться вперед, но я бы дал вам все возможные авансы. Это действительно помогает мне. Я признаю, что не совсем понимаю нюансы stackoverflow, поэтому я приношу свои извинения, если это было не в порядке - но я нахожусь в затруднительном положении, чтобы решить проблему DoS, и это очень помогает. Еще раз спасибо! – notAduck

+0

Всё нормально. Исследовательские усилия и образец кода могут пройти долгий путь здесь. Возможно, мы встретимся позже. Добро пожаловать – Matt

2

Можете ли вы сделать это на PHP?

<?php 
$lines = file($filename, FILE_IGNORE_NEW_LINES); 

foreach($lines as $value) { 
    $arr = explode(' ', $value); 
    $domainarr[] = $arr[5]; 
} 

$occurence = array_count_values($domainarr); 

print_r($occurence); 
?> 
+0

Эй Эйкен. Хотя это может ответить на широкий вопрос, это даже не один из отмеченных языков. – Matt

+0

Hi Matt, tnx для обратной связи. OP заявил, что он доволен чем угодно, и это казалось лучшим способом imho. Я довольно новичок на сайте, не должен ли я его опубликовать? – Aiken

+0

Я благодарен независимому, но глупому вопросу: я уверен, что смогу настроить php-сервер для этого, но я думал, что это исключительно веб-язык, поэтому просто поставьте файл input.txt в тот же каталог, что и этот .php-файл, и ссылается на него (как?), а затем, когда я попадаю на страницу .php, он будет обрабатывать и выводить результаты в браузере? Я был бы более умен в этом, если бы это был сценарий .asp или .bat или .ps1. – notAduck

2

Это в пакете:

@echo off 
setlocal enabledelayedexpansion 
if exist temp.txt del temp.txt 
for /f "tokens=6" %%a in (input.txt) do (Echo %%a >> temp.txt) 
for /f %%a in (temp.txt) do (
set /a count=0 
set v=%%a 
if "!%%a!" EQU "" (
for /f %%b in ('findstr /L "%%a" "temp.txt"') do set /a count+=1 
set %%a=count 
Echo !v:~0,-1! ^(!count!^) 
) 
) 
del temp.txt 

В настоящее время она выводит его на экран.Если вы хотите, чтобы перенаправить его в текстовый файл заменить:

Echo !v:~0,-1! ^(!count!^) 

с:

Echo !v:~0,-1! ^(!count!^) >> output.txt 

Это выводимый:

www.example.com (1) 
ns1.example.com (2) 

С данным выборочных

+0

Спасибо за этот пример - он работает очень хорошо, хотя результат не сортируется по наибольшему количеству экземпляров во-первых, я могу жить с этим. – notAduck

2

Этот пакетный файл решение должно работать быстрее:

@echo off 
setlocal 

rem Accumulate each occurance in its corresponding array element 
for /F "tokens=6" %%a in (input.txt) do set /A "count[%%a]+=1" 

rem Show the result 
for /F "tokens=2,3 delims=[]=" %%a in ('set count[') do echo %%a (%%b) 

Выход:

ns1.example.com. (2) 
www.example.com. (1) 

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

(for /F "tokens=2,3 delims=[]=" %%a in ('set count[') do echo %%a (%%b^)) > output.txt 
Смежные вопросы