2016-06-22 6 views
1

例テキストそれまではパッテンyを有するgrepの行:パターンxに対する検索(およびその行を印刷する)、次の行の次の空白行


dn: uid=test,ou=domain.eu,o=org 
uid: test 
mailEquivalentAddress: [email protected] 
mailEquivalentAddress: [email protected] 

dn: uid=test2,ou=domain.eu,o=org 
uid: test2 

dn: uid=test3,ou=domain.eu,o=org 
uid: test3 

そこですべてのエントリがmailEquivalentAddressを持っていません複数のmailEquivalentAddressが可能です。

1つ以上のmailEquivalentAddressを持つすべてのエントリを取得したいとします。 タイトルを説明する:dn:およびすべての後続の行で始まるすべての行のgrep。ただし、1つ以上のmailEquivalentAddressがある場合のみ、次の空行で停止します。

だから私は取得しようとしている出力は、次のとおりです。mailEquivalentAddressesの可変量で

dn: uid=test,ou=domain.eu,o=org 
uid: test 
mailEquivalentAddress: [email protected] 
mailEquivalentAddress: [email protected] 

+0

サンプルコードはどこですか? –

答えて

4

私はそのためawkを使用します。

awk '$1 ~ /^dn:/{for(i=1;i<=NF;i++){if($i ~ /^mailEquivalentAddress:/){print; break}}}' RS='' file 
  • RS=''レコードセパレータの特別な値です。 awkはファイルを空行(段落)でレコードに分割し、行区切り文字を改行に設定するように指示します。

  • $1 ~ /^dn:/チェック段落の最初の行がループトラフであるdn:

  • プログラム自体で始まる場合、フィールドはワードmailEquivalentAddress:始まるかどうかをチェックするすべてのフィールド。そのようなフィールドが見つかった場合、awkは段落を印刷します。

+0

このスクリプトは、 'mailEquivalentAddress'が設定されていない場合、他の場所で'キーではない '、 'mailEquivalentAddress'だけを含むレコード、つまり'他のキーなし'でレコードが出力されます。 – sjsam

+0

私は、 'mailEquivalentAddress'が空であってはならないという問題の要件を見ません。あなたは?設定値を空の文字列に設定するのは意図的なものかもしれないことに注意してください。さらに、 'mailEquivalentAddress'以外の他のキーが必要であるという要件はどこにありますか? – hek2mgl

+0

「すべてのエントリがmailEquivalentAddressを持っているわけではない」から、キーが空でなければならないことは明らかですか? opがこれを明確にするかもしれない。 'dnで始まるすべての行のgrepは' dn'で始まることを明確にします。私はちょうどこれに対処するために私の編集をしました。時間が許せばそれを見直すかもしれない – sjsam

3

file

dn: uid=test,ou=domain.eu,o=org 
uid: test 
mailEquivalentAddress: [email protected] 
mailEquivalentAddress: [email protected] 

dn: uid=test2,ou=domain.eu,o=org 
uid: test2 

dn: uid=test3,ou=domain.eu,o=org 
uid: test3 

dn: uid=test4,ou=domain.eu,o=org 
uid: test4 
mailEquivalentAddress: [email protected] 
mailEquivalentAddress: [email protected] 

スクリプト

awk 'BEGIN{RS="";ORS="\n\n"}/^dn:.*\nuid:.*\nmailEquivalentAddress: [[:alnum:]]+/' file 

出力

dn: uid=test,ou=domain.eu,o=org 
uid: test 
mailEquivalentAddress: [email protected] 
mailEquivalentAddress: [email protected] 

dn: uid=test4,ou=domain.eu,o=org 
uid: test4 
mailEquivalentAddress: [email protected] 
mailEquivalentAddress: [email protected] 
でサンプルテキスト

注:

  1. 私はmailEquivalentAddress:がキーと見なすことができると仮定しました。
  2. あなたが与えた入力からは、各レコードの間に空白行があることがわかります。したがって、レコード区切りを保持していますRS=""/^dn:.*\nuid:.*\nmailEquivalentAddress: [[:alnum:]]+/ことで
  3. 我々は(開始時)のDNとuidのキーかどうかを確認するために、レコード
    • を見ては、レコード内の強制存在しています。
    • mailequivalentAddress:で始まる行の場合は、それがキーであることが確認できます。次に、[[:alnum:]]+で空でないことを確認します。もしそうなら、レコードを印刷します。
+0

あなたは実際には多かれ少なかれ私の答えが何かを示唆していますが、その言葉が段落の*どこかにあるかどうかをチェックするだけなので、それほど正確ではありません。なぜあなたはそのような答えを投稿しますか? – hek2mgl

+0

@ hek2mgl:私は精度の問題を修正したと思います。 – sjsam

+0

テストしましたか? – hek2mgl

1

これは(GNU SED)のために働くかもしれません:

sed -n '/^dn:/{:a;$!{N;/\n$/!ba};/mailEquivalentAddress:/p}' file 

行が空行またはファイルの終わりまで、多くの行をフェッチdn:始まる場合。これらの行は、mailEquivalentAddress:の存在をテストし、見つかった場合はそれらを出力します。

+0

これは実際に仕事をします!! Tnx。 –

+0

良い答え!ちょうど1つのことは、それがキーであることを保証するために '/ \ nmailEquivalentAddress:/ p'でなければなりません – hek2mgl

関連する問題