2015-03-31 57 views
0

我有一个日志文件,用于监视包括请求和确认在内的大型系统。我的目标是能够:批处理脚本来抓取linestr而不使用文件路径

1.遍历脚本,并获得其中要求&它们的确认发生

2.重要性的整个线拉为字符串行,并将其保存为字符串修改输出到其他地方的变量。

这是我到目前为止有:

@ECHO off 
setlocal 
setlocal enabledelayedexpansion 
setlocal enableextensions 

:: Lets get today's date, formatted the way the ABCD File is named 
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do set targetDate=%%f-%%d-%%e 
:: Now we set the targetFile name 
SET ABCDLogsFile=C:\Users\me\Documents\monitoring_file_for_jim\ABCDFIX*%targetDate%.log 
::****Scrapped original approach***** 
set "ackFoundCount=0" 
set "reqFoundCount=0" 
::Get lines with acks 
for /f delims^=^ eol^= %%a in ('findstr /c:"\<ACK\>" "%ABCDLogsFile%"') do (
    set /a "ackFoundCount+=1" 
    setlocal enabledelayedexpansion 
    for %%N in (!ackFoundCount!) do (
     endlocal 
     set "ackFound%%N=%%a" 
    ) 
) 
::Get lines with requests 
for /f delims^=^ eol^= %%b in ('findstr /c:"ReqSingle" "%ABCDLogsFile%"') do (
    set /a "reqFoundCount+=1" 
    setlocal enabledelayedexpansion 
    for %%N in (!reqFoundCount!) do (
     endlocal 
     set "reqFound%%N=%%b" 
    ) 
) 

setlocal enabledelayedexpansion 
for /l %%N in (1,1,2 %reqFoundCount%) do echo REQ %%N FOUND= !reqFound%%N! 
pause 
for /l %%N in (1,1,2 %ackFoundCount%) do echo ACK %%N FOUND= !ackfound%%N! 
endlocal 

EDIT 2 dbenham

我试图完成,这是完全不必要的前迂回的方式。 多亏了问题和答案在这里:

'findstr' with multiple search results (BATCH)

我有我的剧本和类似的工作。然而,我很好奇它是否有可能在开始时不使用文件路径而获得findstr输出。我只需要将日志中的时间戳记串出来,这将始终是每行的前12个字符(没有文件路径)。我的输出目前以路径为前缀,虽然我可以获得日志最终将在生产中的路径,但以另一种方式尝试并执行操作会更安全。在这个脚本最终运行的时候,每个只有1个或2个请求和答案,这就是为什么我存储所有被发现的。这不是必要的,但我认为如果有两个是两个,那么看到两个就会让人放心。下面是输出看起来像ACK和请求数一样东西:

C:\Users\me\Documents\monitoring_file_for_jim\ABCDFIX 2015-04-01.log:2015-03-26 07:00:11,028 INFO etc... 

我在想,如果我能剥离掉的文件路径的开始,然后所有我需要做的就是只是时间戳的事件将是

for /l %%N in (1,1,1 %reqFoundCount%) do echo Req %%N occurred at: !reqFound%%N:~0,12! >> MorningAckChecks.txt 
for /l %%N in (1,1,1 %ackFoundCount%) do echo ACK %%N occurred at: !ackfound%%N:~0,12! >> MorningAckChecks.txt 
+0

>“我试图将这些变量作为跳过的参数使用for/f,并抓住这些行,但我似乎无法正确地做到这一点。” - 请张贴此代码。 – 2015-03-31 19:07:13

+0

对不起。 – driftandwander 2015-03-31 19:29:43

+0

不容易使用powershell!只是'Select-String -Pattern“stack”-List -SimpleMatch -Path F:\ Andorid \ Andorid.vmx |选择Line,LineNumber',你可以得到线条与你的图案相匹配,并且非常简单! – powershell 2015-03-31 22:06:21

回答

1

我怀疑你不能让SKIP工作,因为你用FOR语句迭代了行号的分隔列表,这意味着这个数字在FOR变量中。问题是,在指定SKIP值或任何其他FOR选项时,不能包含FOR变量或(延迟扩展)。批量解析器在FOR变量被扩展之前评估FOR选项,所以它不可能工作。将变量作为FOR选项的一部分添加时,只能使用正常扩展。

但我不明白你为什么认为你需要行号。 FINDSTR已经能够解析出你想要的行。只需使用FOR/F来迭代每条匹配线。对于每一行,定义一个包含行内容的变量,然后使用子字符串操作来解析出所需的值。

但我可以提供一个替代方案,我认为这可以让你的生活更轻松。 JREPL.BAT是一个复杂的正则表达式文本处理器,可以识别线条并解析出所需的值并进行转换,一次完成。 JREPL。BAT是一个混合的JScript /批处理脚本,它可以在任何从XP以后的Windows机器上本机运行。

如果我知道你的输入是什么样的,你想要的输出是什么,那么我可以使用JREPL.BAT敲一个简单的解决方案。或者您可以阅读大量的内置文档并自行解决。

可通过命令行通过jrepl /?访问文档。您可能想通过更多渠道输出输出,以便一次获得一个屏幕帮助。但我从来没有这样做,因为我的命令行控制台配置了一个很大的输出缓冲区,所以我可以向上滚动查看过去的输出。


编辑 - 在回应评论和更新的问题

这里是你的代码的相关片段所导致的问题。

SET ABCDLogsFile=C:\Users\me\Documents\monitoring_file_for_jim\ABCDFIX*%targetDate%.log 
findstr /c:"\<ACK\>" "%ABCDLogsFile%" 
findstr /c:"ReqSingle" "%ABCDLogsFile% 

问题是你ABCDLogsFile定义包含通配符,这将导致FINDSTR前缀每个匹配符合完整路径匹配发生所在的文件名。

我要给你一个简单的解决方案 - 只要改变ABCDLogsFile的定义如下:

SET "ABCDLogsFile=C:\Users\me\Documents\monitoring_file_for_jim\ABCDFIX<%targetDate%.log" 

说明

我的解决方案依赖于两个无证功能

1)未记录的文件掩码通配符。

  • < - 非常相似,*
  • > - 非常相似,?

这些符号通常用于重定向,所以他们必须是引用或逃跑,如果你想使用它们作为文件掩码通配符。

我们在DosTips讨论未公开的功能 - Dir undocumented wildcards。撒在整个线程(和一个链接)是一些示例用例。

我记录我的非标准通配符http://www.dostips.com/forum/viewtopic.php?p=39420#p39420

2究竟是如何工作的理解)FINDSTR与非标准通配符

工作

FINDSTR将前缀的文件名每个匹配线(也可能是path)如果

  • /M选项用于
  • /F OPTI以下任何条件发生上使用
  • 多个输入文件明确命令行
  • 多个输入文件通过文件掩码暗示与至少一个*?通配符在命令行上列出的

你所得到的文件路径前缀,因为最后一次触发 - 文件掩码中的*

但是,您可以使用<来获得相同的结果,但非标准通配符不会在输出中触发文件前缀。

问题解决了:-)

我谈论这个FINDSTR功能在http://www.dostips.com/forum/viewtopic.php?p=39464#p39464

有一天我希望用这个美味的小珍闻更新我的What are the undocumented features and limitations of the Windows FINDSTR command?文章。

+0

我看过很多人在讨论各种批处理问题时对JREPL.bat的讨论!如果它能帮助解决我的问题,我现在一定会考虑它。我非常清楚,如果FINDSTR已经可以为我完成这项工作,我只是不确定FINDSTR是否可以找到我想要的字符串,然后将它包含在内的整行存储到一个变量中。我一定会在早上更多地关注它。感谢dbenham的回复,您的批量向导状态在您之前。 – driftandwander 2015-04-01 02:53:35

+0

你可以看看我所做的编辑吗?我很好奇是否有办法从FINDSTR的输出中删除文件路径。 – driftandwander 2015-04-01 18:54:06

+0

@driftandwander - 是原始文件中的路径,还是由FINDSTR添加?如果它是原始的,那么FINDSTR不能去掉它。但JREPL可以轻松完成。如果路径是由FINDSTR添加的,那么可能有办法避免它,这取决于什么触发了路径添加。你应该显示你的代码。 – dbenham 2015-04-01 19:34:55

1

此帖已成为有点混乱。如果您发布了与您获得的输出相对应的输入行,这将非常有帮助。如果你不能这样做,那么在你的FOR之前添加这条语句。我相信你会发现testReqSkip是空白的。

echo.testReqSkip=%testReqSkip% 
+0

哦,testReqSkip的值是@@,264,296 @@,它在原始文章中。对不起,这篇文章已经不再清晰了,我现在离开我的工作站,并且能够在我再次访问时澄清更多内容。真的很抱歉! – driftandwander 2015-04-01 02:49:29

相关问题