2011-06-16 42 views
1

我有一堆IIS日誌和PowerShell 2.0。powershell select-string列

我目前使用下面的命令來查找一些信息出來對他們(其中「跨域」發生在他們):

dir -r -i *.log | select-string "crossdomain" | Select-Object | export-csv test.csv 

這就給了我,像這樣一些數據:

TRUE 1132740 2011-06-09 11:13:49 W3SVC322653822 myserver-WEB1 1.1.1.1 GET /crossdomain.xml - 80 - 1.1.1.1 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+8.0;+Windows+NT+6.0;+Trident/4.0;+GTB6.5;+SLCC1;+.NET+CLR+2.0.50727;+Media+Center+PC+5.0;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30618) WT_FPC=id=82.40.25.58-3980883472.30062468:lv=1307614413232:ss=1307614405277;+__utma=151217894.932228880.1307618019.1307618019.1307618019.1;+__utmz=151217894.1307618019.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);+myserverVISITOR=eyJzaVZpc2l0VHJhY2tpbmcxIjpbeyJWSVNJVERBVEUiOiJNYXksIDEzIDIwMTEgMDY6NTc6NTAiLCJTVEFOREFSRElURU1JRCI6NjQ0MTkzLjB9LHsiVklTSVREQVRFIjoiTWF5LCAxMyAyMDExIDE1OjU0OjMyIiwiU1RBTkRBUkRJVEVNSUQiOjYwMzc4OC4wfSx7IlZJU0lUREFURSI6Ik1heSwgMTUgMjAxMSAxMzo0MDoxNCIsIlNUQU5EQVJESVRFTUlEIjo2NDQxOTUuMH0seyJWSVNJVERBVEUiOiJNYXksIDE1IDIwMTEgMTQ6MDE6NDEiLCJTVEFOREFSRElURU1JRCI6NjQ0MTkyLjB9LHsiVklTSVREQVRFIjoiTWF5LCAxNSAyMDExIDE0OjAzOjIyIiwiU1RBTkRBUkRJVEVNSUQiOjY0NDIxMC4wfSx7IlZJU0lUREFURSI6Ik1heSwgMTUgMjAxMSAxNDoyMTozMiIsIlNUQU5EQVJESVRFTUlEIjo2NDQ2MjAuMH0seyJWSVNJVERBVEUiOiJNYXksIDIyIDIwMTEgMDk6MTM6NTIiLCJTVEFOREFSRElURU1JRCI6NjI5NzYyLjB9LHsiVklTSVREQVRFIjoiSnVuZSwgMDcgMjAxMSAxMTo1MjoxMiIsIlNUQU5EQVJESVRFTUlEIjo2NDUxMjMuMH1dLCJ2aXNpdG9ySWQiOiI1QkFGNzg4NjNERDBENjQ3MUU4NkZENTYwQzU4NTFEMCJ9;+myserverGFSurvey=1;+ebNewBandWidth_.myserver.co.uk=251%3A1303383702897;+__utmb=151217894.1.10.1307618019;+__utmc=151217894 - myserver.co.uk 200 0 0 601 1506 0 W3SVC322653822_ex110609.log.log E:\w3\W3SVC322653822_ex110609.log.log crossdomain  System.Text.RegularExpressions.Match[] 

這是很好,很花哨,但不夠花哨。

我真正想要做的是從文件中出現crossdomain的末尾獲取第7列的導出。因此,這部分在這裏:

**myserver.co.uk** 200 0 0 601 1506 0 

(在myserver.co.uk)

對此有何祕訣?

乾杯

回答

2

到Mjolinors'答案相似,但我會盡量保持正則表達式儘可能的簡單。既然你已經選擇了以詞「跨域」行,你不必搜索只是:

Get-Content test.csv | Foreach-Object 
{ 
    if ($_ -match '(\w+\.\w+\.\w+ \d+ \d+ \d+ \d+ \d+ \d+)') 
    { 
     $matches[1] 
    } 
} 

你不會得到任何「意外令牌」的錯誤,但你可能需要調整正則表達式來獲得你想要的結果(我假設你正在尋找一個三點域和六個數字後面)。

當你不需要變量外推時,總是使用'​​'作爲字符串。它更安全。

1
get-content test.csv | 
foreach -object { 
$_ -match ".+\s([a-z\.]+)\s[\s\d]+\S+\s\S+\s+crossdomain\s+\S+$" > $nul 
$matches[1] 
    } 
+0

我正在嘗試這個,但我得到一個意外的令牌匹配表達式或語句 – Jarede 2011-06-16 15:32:57

+0

我不能重複那個錯誤。對於我發佈的測試數據,它效果很好。你確定把腳本正確地複製/粘貼了嗎? – mjolinor 2011-06-17 10:38:59