2016-05-05 45 views
0

我有一個多行字符串,我需要從字符串中得到一個單詞。這個詞是在遵循本文正是一條線: ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text和人品57.如何在Powershell中解析此文本?

什麼會在PowerShell中返回的是在下一行開始於字符位置57單個字的最佳方式開始?以下是我想要返回文本的一些示例文本I_NEED_TO_BE_FOUND

Lorem ipsum dolor sit amet,consectetur adipiscing elit。在consecat neque,sed dictum massa的Vestibulum。在hac cubasse platea中最明顯。 Aenean吃了一頓,dapibus quis dolor a,dictum hendrerit risus。 Quisque坐amet porttitor前。 Curabitur tempor sed augue nec congue。 Vestibulum lectus sem,iaculis quis dignissim at,condimentum sed diam。 ut libero quam,elementum egestas tristique eu,fringilla eget ipsum。

Etiam dui nisi,blandit a tempus vitae,dictum ultricies neque。 Duis hendrerit nunc id egestas tempus。 Praesent egestas viverra orci id pretium。 Phasellus augim enim,porttitor vulputate mattis sit amet,vulputate et diam。個人簡歷尼斯。 Sed父親mi mollis pellentesque cursus。 sed vel quam vestibulum,pulvinar magna vel,tincidunt nisi。 Sed效率是一個積累。

ProcessStepLogID StartedAt拍攝時間返回代碼進程名稱命令文本
201605050000064594 2016年5月5日14:46:37.790 4秒1 I_NEED_TO_BE_FOUND A_Command

Morbi interdum前庭turpis,UT pellentesque蚤sollicitudin非。 Ut dignissim ligula velit,非商品硫痠軟骨素lacinia。 Maecenas tempus aliquam lacus at efficitur。 Duis turpis tellus,調味品ul ulcorcorper ac,porttitor quis urna。在hac cubasse platea中最明顯。 Donec suscipit velit turpis,quis pretium sapien suscipit quis。 Maecenas at enim ac nibh malesuada commodo eget quis libero。

編輯

我試圖@ mjolinor的回答這個修改,但它不匹配。

$text = @' 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum at consequat neque, sed dictum massa. In hac habitasse platea dictumst. Aenean ante justo, dapibus quis dolor a, dictum hendrerit risus. Quisque sit amet porttitor ex. Curabitur tempor sed augue nec congue. Vestibulum lectus sem, iaculis quis dignissim at, condimentum sed diam. Ut libero quam, elementum egestas tristique eu, fringilla eget ipsum. 

Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. Duis hendrerit nunc id egestas tempus. Praesent egestas viverra orci id pretium. Phasellus augue enim, porttitor vulputate mattis sit amet, vulputate et diam. Fusce vitae tempus nisi. Sed auctor mi mollis pellentesque cursus. Sed vel quam vestibulum, pulvinar magna vel, tincidunt nisi. Sed efficitur id dui a accumsan. 

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text 
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command 

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. Ut dignissim ligula velit, non commodo tellus sodales lacinia. Maecenas tempus aliquam lacus at efficitur. Duis turpis tellus, condimentum ut ullamcorper ac, porttitor quis urna. In hac habitasse platea dictumst. Donec suscipit velit turpis, quis pretium sapien suscipit quis. Maecenas at enim ac nibh malesuada commodo eget quis libero. 
'@ 

$regex = @' 
(?ms).+ 
^ProcessStepLogID 
(.+) 
.+ 
'@ 

if ($text -match $regex) 
    {$matches[1].Split()[6]} 

回答

3

使用多行正則表達式。 (它看起來像你的目標字符串實際上開始在位置52)

PS C:\> $text = @' 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum at consequat neque, sed dictum massa. In hac habitasse platea dictumst. Aenean ante justo, dapibus quis dolor a, dictum hendrerit risus. Quisque sit amet porttitor ex. Curabitur tempor sed augue nec congue. Vestibulum lectus sem, iaculis quis dignissim at, condimentum sed diam. Ut libero quam, elementum egestas tristique eu, fringilla eget ipsum. 

Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. Duis hendrerit nunc id egestas tempus. Praesent egestas viverra orci id pretium. Phasellus augue enim, porttitor vulputate mattis sit amet, vulputate et diam. Fusce vitae tempus nisi. Sed auctor mi mollis pellentesque cursus. Sed vel quam vestibulum, pulvinar magna vel, tincidunt nisi. Sed efficitur id dui a accumsan. 

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text 
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command 

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. Ut dignissim ligula velit, non commodo tellus sodales lacinia. Maecenas tempus aliquam lacus at efficitur. Duis turpis tellus, condimentum ut ullamcorper ac, porttitor quis urna. In hac habitasse platea dictumst. Donec suscipit velit turpis, quis pretium sapien suscipit quis. Maecenas at enim ac nibh malesuada commodo eget quis libero. 
'@ 

$regex = @' 
(?ms).+ 
ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text.*? 
(.+) 
.+ 
'@ 

if ($text -match $regex) 
    {$matches[1].Split()[6]} 

I_NEED_TO_BE_FOUND 

PS C:\> 
+0

真的很抱歉,但它應該是匹配行後的第六個空格後面的文本。你介意調整你的答案嗎?我想知道是否String.Split在這裏適合? –

+0

新需求的調整答案。 – mjolinor

+0

您的示例有效,但它不適用於真實數據。我認爲這是因爲我在這行'ProcessStepLogID StartedAt'的一些單詞之間有一些標籤。你將如何改變正則表達式,以便它在以'ProcessStepLogID'開頭的行之後匹配行?換句話說,在以ProcessStepLogID開頭的行之後匹配整行。我編輯了我的問題來展示我的嘗試。 –

1

這可能是看到mjolinor的答案後,你

$string = @' 
Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. 

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text 
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command 

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. 
'@ 

$array = $string.Split("`n") 

$selection = $array | select-string -Pattern 'processsteplogid' -Context 1 

$csvstring = $selection.ToString().Split("`n").Trim('> ').Replace(' ', ',') | select -Skip 1 

$obj = $csvstring | ConvertFrom-Csv 

$obj 

的選項,這裏是我將如何使用正則表達式創建對象,我覺得從這個結果看起來不比我前面的例子

$regex = '(ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text\r?\n.*)' 

$obj = if ($string -match $regex) { 
    $Matches[1].Split("`n") | ConvertFrom-Csv -Delimiter ' ' 
} 

$obj 

因爲空間,對象名稱 - 值對可能是廢話,但 - 假設總是會有相同數量的空間 - 你可以得到什麼喲你想從$ obj.process中取出,或者這可以進一步細化以理解與它們的值相關的屬性名稱