2017-08-10 3 views
-1

ここで私がしたいことがあります。私は複数の方法で区切られた行を持つファイルを持っており、それらの行のパターンに基づいて複数の部分文字列を取得したい。同じ行に複数のregexpパターンを取り込む

ですから、例えばラインは、このようなものになるだろう。つまり、私は、「サーバー名」をキャプチャする、「2017年08 07」、「SomeText1」と私の各行における「SomeText2」で

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

ファイル。

私はperl -Pでそれをやってみましたが、正の先読みや後ろ向きですが、最初のものだけが動作します。 1行あたりの結果も1行で出力する必要があります(複数のgrep -oPでパイプするのは受け入れられません)。

どうすればよいですか?

+1

あなたの質問にそのサンプル入力の出力を追加してください。 – Cyrus

+2

'awk -F '[。:;]' '{print $ 1、$ 3、$ 4、$ 6}'ファイル '? – Cyrus

+0

ファイルの1行あたりの出力は、次のようになります。 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

あなたが:または;が満たされるまで、先に.の文字列を抽出したいようです。ロジックは、あなたが希望するものである場合は、それを行うためのPerlでgrep

$ 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の問題は、異なる行に出力を出力することです。出力は1行にする必要があります(例: servername 2017 08 07 SomeText1 SomeText2 – Arkandel

+0

出力を 'tr -d 'にパイプライン化します\ n'' – CWLiu

関連する問題