2017-08-10 97 views
-1

這是我想要做的。我有一個以多種方式分隔線條的文件,我想根據這些線條的模式捕獲多個子串。在同一行上捕獲多個正則表達式模式

所以一個例子線將是這樣的:

servername.domain:2017 08 07.SomeText1.otherIrrelevantStuff;SomeText2.MoreStuff 
^^^^^^^^^^  ^^^^^^^^^^ ^^^^^^^^^      ^^^^^^^^^ 

換句話說,我想捕捉「服務器名」,「2017年08 07」,「SomeText1」和「SomeText2」中的每一行我文件。

我試着用perl -P和積極lookahead /後面,但只有第一個工程。每行的結果也應該打印在一行中(因此不能通過幾個grep -oP進行管道)。

你會怎麼做?

+1

請將您希望的輸出樣本輸入添加到您的問題中。 – Cyrus

+2

'awk -F'[。:;]''{print $ 1,$ 3,$ 4,$ 6}'file'? – Cyrus

+0

文件的每行所需的輸出應該是這樣的: servername 2017 08 07 SomeText1 SomeText2 – Arkandel

回答

0

在awk中,添加所需的正則表達式的match

$ awk ' 
BEGIN { OFS="," } 
{ 
    while(match($0,/servername|2017 08 07|SomeText1|SomeText2/)) { 
     b=b (b==""?"":OFS)substr($0,RSTART,RLENGTH) 
     $0=substr($0,RSTART+RLENGTH) 
    } 
    print b 
}' file 
servername,2017 08 07,SomeText1,SomeText2 
0

似乎要提前.提取字符串直到:;得到滿足。如果邏輯是你想要的東西,那麼你可以使用grep用Perl來做到這一點,

$ s="servername.domain:2017 08 07.SomeText1.otherIrrelevantStuff;SomeText2.MoreStuff" 

$ grep -oP '[0-9a-zA-Z\s]+(?=\.)' <<< "$s" 
servername 
2017 08 07 
SomeText1 
SomeText2 

簡要說明,

  • (?=\.):提前點相匹配的話
  • [0-9a-zA-Z\s]+grep會打印這部分,匹配0-9,AZ,az或空格的模式。
+0

在這種情況下,grep的問題是它在不同的行上打印輸出。輸出應該在單行(文件的每行)中,例如: servername 2017 08 07 SomeText1 SomeText2 – Arkandel

+0

也許將輸出傳輸到'tr -d'\ n'' – CWLiu