目前需要寫一個"批次檔"能夠過濾log中的資料,log中的資料型態大概如下:
event=1
c:\windows\explorer.exe
result=allowed
event=2
c:\windows\explorer.exe
result=allowed
event=1
c:\windows\explorer.exe
result=allowed
我只需要擷取過濾出"event=2"事件中的下面一行,並且輸出另存至別的檔案,請問該如何做到過濾,目前嘗試用findstr指令,但是還沒寫成功 @@
在 linux 中的 sed 就可以很容易解決此問題:
<pre class="c" name="code">
sed -n '/event=2/ {N; /\n.*/ p;}' 檔名
這是參考 Sed - An Introduction and Tutorial 裡 Working with Multiple Lines 的語法,就符合您想解決的問題。
如果要砍<Parent>的字樣,可把指令再延伸些:
<pre class="c" name="code">
sed -n '/event=2/ {N; /\n.*/ p;}' 檔名 |sed -e 's/<Parent>\(.*\)<\/Parent>/\1/g'
因您是在 windows 的環境,可安裝 Sed for Windows。
請裝這個 GNU 版本的 sed,傳統非gnu的sed,用上述的語法會無法執行。
安裝方式須下載每個所需檔案:
http://downloads.sourceforge.net/gnuwin32/sed-4.2-1-bin.zip
只要把裡面 bin 目錄的 sed.exe 複製到 C:\Windows 裡,
在 CMD 裡執行 sed,會說少什麼,
就依續下載以下的檔案,
所需的檔案會在 該壓縮檔裡的 bin 目錄中,複製到 C:\Windows 裡,
依此動作連續執行。
http://gnuwin32.sourceforge.net/packages/libintl.htm
http://gnuwin32.sourceforge.net/packages/libiconv.htm
http://gnuwin32.sourceforge.net/packages/regex.htm
TEMP是暫存的檔案名稱
LOGNAME是日誌檔名稱
FILTER是整理過的檔名
<pre class="c" name="code">
SET TEMP=TEMP
SET LOGNAME=FILE.LOG
SET FILTER=FILTER.TXT
findstr /n "^" %LOGNAME% > %TEMP%
SET C=1
for /f "tokens=1* delims==" %%I in ('FINDSTR /N "^" %LOGNAME%') DO (
SET /A C=!C!+1
IF "%%J"=="2" (
FOR /F "TOKENS=1* DELIMS=:" %%J IN ('FINDSTR /B !C!: %TEMP%') DO (
SET F=%%K
ECHO !F:~8,-9! >> %FILTER%)))
以上請參考~