2015-03-31 59 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

相關問題