我有一个大文件,里面有这样的行...
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 - 输出文件可以是任何内容。理想情况下是一个命令行过程,但我真的迷失了所以我会对任何事情感到满意。
答案 0 :(得分:3)
Cat有点不合适所以让我们尝试一下。这是一个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当然是一个帮助程序员和编程爱好者的网站。我们正在投入我们的空闲时间,因为有些人得到了报酬。
答案 1 :(得分: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);
?>
答案 2 :(得分: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)
使用样本数据
答案 3 :(得分: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