如何查询某些关键词的多个文本文件并在文本中输出结果?

时间:2015-06-17 22:32:26

标签: powershell batch-file

这是我的目标:

  1. 我有一个网络文件夹(Windows 7),其中包含每天生成的文本日志文件(每天1个日志文本),因此文件名包含各种日期。
  2. 我需要一个脚本进入并扫描每个新的日志文件以获取某些关键字的列表:" ABC"," DEF"," GHI"。然后写出在每个日志文件中找到了多少这些事件,并以文本格式或类似方式保存此信息。
  3. 我面临的问题:我如何解决各种文件名,每个文件名都包含该日期。如何查看关键字列表并计算每个日志文件中的所有这些单词。如何在单独的文本文件中写出结果。最后有没有办法自动化所有这些?

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

2 个答案:

答案 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

答案 1 :(得分:0)

在PowerShell中,我们可以使用Get-Childitem来收集我们想要搜索的文件,并将它们存储在变量中:

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

将这些文本文件存储到Content变量后,我们只需使用-match regex运算符即可在该文件集合中找到匹配项。

$Content -match "Bacon"

然后您可以使用Out-File输出此信息:

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

当然,使用Get-child项目,您可以使用DateTime运算符,并根据需要缩小查询范围,仅查看最近更改的文本文件。

如果你想获得更多的技术,我们可以使用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。它会给你出现数字。

相关问题