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

他のデータは気にせず、「応答が送信されました」の後にあるものだけを気にします。ドメイン名の最も一般的な出現のソートされたリストが必要です。問題は、すべてのドメイン名を前もって知ることができないため、文字列を検索するだけでは済まないことです。

上記の例を使用して、出力を次のようにしたいと思います

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

...ここで、( ) 内の数字はその発生回数です。

Windowsでこれを行うには、どのように/何を使用できますか? 入力ファイルは .txt です。出力ファイルは何でもかまいません。理想的にはコマンド ライン プロセスですが、私は本当に迷っているので、何でも構いません。

4

4 に答える 4

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

正規表現があるので、その仕組みを説明するリンクを保存しました。

SOはもちろん、プログラマーやプログラミング愛好家を支援するサイトであることを覚えておいてください。一部の人々がこれを行うために支払われるように、私たちは自由な時間を費やしています。

于 2015-04-21T01:38:02.000 に答える
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);
?>
于 2015-04-21T01:21:42.327 に答える
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
于 2015-04-21T03:19:25.870 に答える
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)

サンプルデータで

于 2015-04-21T01:40:33.560 に答える