2017-06-09 15 views
-4

ディレクトリに複数のファイルがあります。すべてのファイルの文字列として行末を含む複数のパターンのgrep

内容:

Client=WebsiteContent 
Operation=Eligibility 
EnvName=StoreWebsite 
Program=DummyService 
EOE 
----------------------------------------------- 
Client=WebsiteContent 
Operation=Eligibility 
Dummy=Hello 
EnvName=StoreWebsite 
Program=DummyService 
Metric=Helloworld 
EOE 
----------------------------------------------- 

grep通常、行ごとに動作します。代わりに、EOEという文字列をinput record separatorと見なして、複数のフィールドでgrepできるようにしたいと考えています。

例:

私はClient属性がWebsiteContentが含まれており、Operation属性がEligibilityが含まれている別の「プログラム」をgrepしたいです。

出力:

Program=Dummy 
Program=Something 
Program=Hello 

EDIT:

私は上記のコマンドは私に結果を与える

zcat * | perl -ne '$/="EOE"; next unless /Client=WebsiteContent/ && Operation=Eligibility/; print $_;' | grep 'Program=.*' 

を使ってPerlでこれを行います。しかし、私はこの使用してシェル(grepawksedなどを)やりたい

+0

は、ご質問があれば私に知らせてください。 – syedalisait

+1

これは問題です。今まで何を試しましたか?コードを私たちに教えてください。 – AbhiNickz

+3

私はあなたのコードはどこですか? –

答えて

0

をそれを行うには

perl -ne 'BEGIN{$/="\nEOE\n"} next unless /Client=WebsiteContent/ && /Operation=Eligibility/; /Program=.*/ && print "$&\n";' 

フィールドを区切ります。一時的に、あなたは、レコードを区切るために(セミコロンなど)別の未使用の文字が必要になります。

cat input_file.txt | tr '\n' ':' | sed 's/---:/---;/' | tr ';' '\n' 

のことができます。その後、パイプgrepているの結果:次に

| grep 'Client=WebsiteContent' | grep 'Operation=Eligibility' 

をパイプそのバックの結果trを通じて:

| tr ':' '\n' 
+0

うわー。ニース。私はこれを試してみる。 – syedalisait

+0

魅力的に機能します。ありがとう@ジャック – syedalisait

0

$/="EOE"BEGINでなければなりませんそれ以外の場合は1つの試合を見逃す危険性があります。

grepプロセスは、perlプロセスで行うことはできません。そうでなければあなたが持つパイプがコロンと行(またはいくつかの他の未使用の文字)に各レコードを変換するのにことを実行することができます唯一のUNIXツールやパイプラインで

...| tr '\n' , | sed 's/,EOE,/\n/g' | grep Client=WebsiteContent | grep Operation=Eligibility | tr , '\n' | grep Program= 
1

まず第一に - 試してみて、1つのライナーにこれを強制しないでください。そんなに便利ではありません。特に、シェルコマンドをデイジーチェーン接続しようとしている場合。これは、ハッシュにキーと値のマッチングを使用して、名前付きの値を抽出し

#!/usr/bin/env perl 
use strict; 
use warnings; 

local $/ = 'EOE'; 
while (<>) { 
    my %record = m/(\w+)=(\w+)/g; 
    print $record{'Program'},"\n"; 
} 

:どの程度

。あなたはその後、拡張することができ

#!/usr/bin/env perl 
use strict; 
use warnings; 

local $/ = 'EOE'; 
while (<>) { 
    my %record = m/(\w+)=(\w+)/g; 
    if ( $record{'Operation'} eq "Eligibility" 
     and $record{'Client'} eq "WebsiteContent") 
    { 
     print $record{'Program'}, "\n"; 
    } 
} 
+0

私はこの答えがかなり好きです。シェルで答えが無ければ、私は投票してそれを正しいとマークし、このスレッドを閉じます。 – syedalisait

関連する問題