使用PowerShell获取文本文件中的列

时间:2015-05-27 10:00:00

标签: powershell

我有一个文本文件,其中包含10列。

现在我的问题是:我需要搜索字符串并获取所需列的输出。

例如:我的文本文件包含:

#Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Referer) cs-host sc-status sc-win32-status sc-bytes cs-bytes time-taken
2014-06-01 00:00:00 W3SVC1 abc814 121.30.83.14 POST /ASP1/WebServices/cloud.asmx - 80 - 70.27.127.10 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+8.0;+Windows+NT+5.1;+Trident/4.0;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729;+.NET4.0C;+.NET4.0E) http://cloud.each.com/ASP1/cloud/Operator.swf cloud.each.com 200 0 3889 5054 46
2014-06-01 00:00:00 W3SVC1 abc814 121.30.83.14 POST /ASP1/WebServices/range.asmx - 80 - 70.27.127.10 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+8.0;+Windows+NT+5.1;+Trident/4.0;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729;+.NET4.0C;+.NET4.0E) http://cloud.each.com/ASP1/cloud/Operator.swf cloud.each.com 200 0 3889 5054 46

现在,我需要搜索range.asmx并仅获取有限的列(时间,服务器名称,IP)到不同的Excel文件。

谢谢, 格利扬

2 个答案:

答案 0 :(得分:1)

#Fields行不会像标题一样正确解析,所以你需要按摩一下才能让它在Powershell中运行:

$search = 'range.asmx'

$header = (Get-Content data.csv -TotalCount 1).Replace('#Fields: ','').split()
Get-Content data.csv |
select -Skip 1 |
ConvertFrom-Csv  -Delimiter ' ' -Header $header |
where { $_.'cs-uri-stem' -like "*$search*" }|
select time,'s-ip','cs-host','sc-status'

答案 1 :(得分:0)

删除#Fields使其成为CSV格式,以空格分隔。然后:

$search = 'range.asmx'
$data = Import-Csv data.csv -Separator ' '
$data | ? cs-uri-stem -like "*$search*" | select time,'s-ip','cs-host','sc-status'