2016-05-05 13 views
0

私は複数行の文字列を持っており、文字列から1語を取得する必要があります。 ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Textと入力し、文字57で始まります。Powershellでこのテキストを解析するには?

次の行の文字の位置57から始まる1単語を返すPowershellの最良の方法は何でしょうか?ここにテキストを返信したいサンプルテキストがありますI_NEED_TO_BE_FOUND

Lorem ipsum dolor sit amet、consectetur adipiscing elit。その結果としての前庭。 hac habitasse platea dictumstでは、 Aenean ante justo、dapibus quis dolor a、dictum hendrerit risus。 Quisqueは、ポートタイトを元にしています。クレイビュール・テン・セイ・オーグ・ヌー・コグュー。 Vestibulum lectus sem、iaculis quis dignissim at、condimentum sed diam。 Ut libero quam、elementum egestas tristique eu、fringilla eget ipsum。

エティアム・デイ・ニッシー、ブラディット・テンポス・ビー、ディクタム・ウルトラリズネイケ。デュース・ヘンドリート・ヌンク・エステスタ・テンポス。 Praesent egestas viverra orci id pretium。 Phasellus augue enim、porttitorはmattis sit amet、vulputate et diamを評価します。ニキビの繁殖。 Sed auctor mi mollis pellentesque cursus。祈りの祈りの前庭、祈りの祈り、祈りの祈り。セドは偶像崇拝者である。

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非。ウサギの甲状腺腫、甲状腺腫のラコニア。マセナマスの恒久的な場所である。デュイス・ターピス・トゥルタス、コンディショナム・ウラン・コルパー・ア・ポッター、ポルター・クス・ウルナ。 hac habitasse platea dictumstでは、ドネカは眠りにつきます。 Maecenas at enim ac nibh malesuadaの商品をすべて見る

EDIT

は、私は、@ 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

これは本当に申し訳ありませんが、マッチラインの後の6番目のスペースの後のテキストにする必要があります。あなたの答えを調整してもよろしいですか?ここで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を欲しがっています。これはさらに、その値に関連してプロパティ名を理解するために洗練されます。

関連する問題