2015-06-17 100 views
2

这是我的目标:如何查询某些关键词的多个文本文件并将结果输出为文本?

  1. 我有一个包含了每天(每天1个日志文本)上生成文本日志文件在网络文件夹(Windows 7),结果文件名包含不同日期。
  2. 我需要一个脚本来扫描每个新的日志文件中的某个关键字列表:“ABC”,“DEF”,“GHI”。然后写出在每个日志文件中找到了多少这些事件,并以文本格式或类似方式保存这些信息。

我面对的问题:我如何绕过各种文件名,每个文件名都包含那天的日期。我如何查看关键字列表并计算每个日志文件中的所有这些单词。我如何在单独的文本文件中写出结果。最后是否有办法将所有这些自动化?

我想留在PowerShell中或使用Windows批处理文件。

+0

是的,这可以做到。 '选择字符串'我认为会发挥很大的作用。对于自动化,您可以考虑计划任务。请限制您的帖子到一个问题。[计划的任务在PowerShell上覆盖SO](http://stackoverflow.com/questions/18259951/powershell-script-does-not-run-via-scheduled-tasks)所以你应该能够找到帮助 – Matt

+0

谢谢。安排这是下一步。我试着选择字符串,仍然试图找出如何搜索多个参数,并将它们报告在可读表中,并记录所有事件,并将其记录到多个日志文件中 –

回答

0

恐怕您的要求不明确,并有几个缺失的细节。然而,在这里它与什么我猜可能是第一次尝试得到一个解决方案的批处理文件:

编辑:我修改的原代码,以还组每个事件的文件;第一个代码只是将每个文件的事件分组。

@echo off 
setlocal EnableDelayedExpansion 

rem Push dir to the networked folder 
pushd "\\Path\to\networked\folder" 

rem Count all file/event combinations in a two-dimensional array 
for %%a in (ABC DEF GHI) do (
    for /F "delims=:" %%b in ('findstr /I /L "%%a" logFiles*.txt') do (
     set /A "count[%%~Nb][%%a]+=1" 
    ) 
) 

rem Group events for the same file 
for /F "tokens=2,3* delims=[]=" %%a in ('set count[') do (
    set "file[%%a]=!file[%%a]!, %%b (%%c)" 
) 

rem Show the final result 1: events per file 
(
    echo Events per file: 
    for /F "tokens=2* delims=[]=" %%a in ('set file[') do (
     set "line=%%b" 
     echo %%a.txt = !line:~2! 
    ) 
) > result1.txt 

rem Group and count files for the same event 
for /F "tokens=2,3* delims=[]=" %%a in ('set count[') do (
    set "event[%%b]=!event[%%b]!, %%a.txt (%%c)" 
    set /A "eventCount[%%b]+=%%c" 
) 

rem Show the final result 2: files per event 
(
    echo Files per event: 
    for /F "tokens=2* delims=[]=" %%a in ('set event[') do (
     set "line=%%b" 
     echo "%%a" - !eventCount[%%a]! found in !line:~2! 
    ) 
) > result2.txt 
+0

谢谢。它如何解决变量日期文件名? –

+0

也许如果你解释什么“变量日期文件名”意味着我可以相应地修改代码。您应该发布一个包含多个文件名和期望结果的列表。请修改原始问题,不要在评论中发布其他信息!顺便说一句,我读了_in对其他answer_ **':/'**的评论,也许你想要“转置”的结果(每个事件文件),所以我修改了我的代码的结果;请参阅编辑。 – Aacini

0

在PowerShell中,我们可以使用Get-Childitem收集我们想要的文件,但搜索和存储那些变量作为这样的:一旦这些文本文件存储到我们的内容变量

$Content = Get-Content (Get-Childitem -Path C:\Temp\*.txt) 

我们可以简单地使用-match正则表达式运算符来查找该文件集合内的匹配项。

$Content -match "Bacon" 

,你可以再出这个信息用出文件:

$Content -match "Bacon" | Out-file C:\Temp\Bacon.txt 

当然你可以使用日期时间运算符和缩小查询才改成文本文件的获取,子项按要求。

如果你想获得更多的技术,我们可以用Select-String会得到这个输出多个匹配,而这样的:

Get-ChildItem C:\Logs | 
    where { $_ | Select-String -Pattern 'Blahblah' } | 
    where { $_ | Select-String -Pattern '\d{4}' } | 
... 

你也可以做一个行:

gci C:\Logs| select-string -pattern '(Bacon.*Failed)|(Failed.*Steak)' 

输出完全取决于你的想象力。一旦它们只是简单的字符串,就可以将它们放入数组或自定义PS对象中以获得更好的输出。它只会要求你将你正在运行的命令保存到一个变量中,然后再调用它来输出。

对于分组,请查看Group-Object cmdlet。它会给你出现的次数。

+0

谢谢! 2个问题: –

+0

1.我可以传递多个匹配参数吗? “ABC”,“DEF”等? 2.在out文件中有一种方法可以生成一个表格,其结果如下:参数“ABC” - 10(找到10次) - “1-1-15_log.txt”(找到它的日志文件); “DEF” - 3(找到3次) - “1-2-15_log.txt”(找到它的日志文件)等 –

+0

已更新我的答案以帮助您解决问题。 – bundyfx

相关问题