iT邦幫忙

0

如何用"批次檔"過濾log中的資料

目前需要寫一個"批次檔"能夠過濾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指令,但是還沒寫成功 @@

2 個回答

12
逮丸逮丸
iT邦大師 1 級 ‧ 2010-04-06 20:47:19
最佳解答

在 linux 中的 sed 就可以很容易解決此問題:

<pre class="c" name="code">
sed -n '/event=2/ {N; /\n.*/ p;}' 檔名

這是參考 Sed - An Introduction and Tutorial 裡 Working with Multiple Lines 的語法,就符合您想解決的問題。

如果要砍<Parent>的字樣,可把指令再延伸些:

&lt;pre class="c" name="code">
sed -n '/event=2/ {N; /\n.*/ p;}' 檔名 |sed -e 's/&lt;Parent>\(.*\)&lt;\/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

zl5338 iT邦新手 5 級 ‧ 2010-04-06 23:01:48 檢舉

感謝,可以用~
不過你的指令中的「'」要全部改成「"」才可以運行~

再次感謝~ ^^

8
蟹老闆
iT邦大師 1 級 ‧ 2010-04-06 22:54:30

TEMP是暫存的檔案名稱
LOGNAME是日誌檔名稱
FILTER是整理過的檔名

&lt;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%)))

以上請參考~

zl5338 iT邦新手 5 級 ‧ 2010-04-06 23:04:34 檢舉

感謝提供解決辦法,我在實驗一下跟樓上的方法哪個方便使用,因為還有很多需要過濾的東西@@~
還是感謝唷~

蟹老闆 iT邦大師 1 級 ‧ 2010-04-07 09:21:02 檢舉

如果還有其他的東西過濾就效能上來說MSDOS內建的外部指令並無法勝任大任,做不了太多事的,需尋求其他的指令程式。

sula3065408 iT邦研究生 1 級 ‧ 2010-04-07 14:31:44 檢舉

SED比較強,有正則表示式可以用。

我要發表回答

立即登入回答