2

さて、名前とメールアドレスを次の形式で含む単一のテキスト ファイルを生成する必要があります

名前、メールアドレス

ldapsearch の出力から。しかし、それは見た目ほど単純ではありません (少なくとも私にとっては)。

私は電子メールアドレスのリストを持っているところです:

 ldapsearch -x -b ou=<somevalue>,ou=<somevalue>,ou=<somevalue>,dc=<somevalue>,dc=<somevalue> objectClass=posixAccount | grep "^mail: .*$" | awk '{print $2}'

および名前のリスト:

 ldapsearch -x -b ou=<somevalue>,ou=<somevalue>,ou=<somevalue>,dc=<somevalue>,dc=<somevalue> objectClass=posixAccount | grep "^description: .*$" | awk '{print $2,$3}'

しかし、私が試したものは何でも-上記のように必要なリストを提供する単一のコマンドを取得できません...

このコマンドは、名前と電子メールの両方を表示しますが、1 行では表示されません。

ldapsearch -x -b ou=<somevalue>,ou=<somevalue>,ou=<somevalue>,dc=<somevalue>,dc=<somevalue> objectClass=posixAccount | awk '/description:|mail:/{print $2,$3}'

これを解決するクールな正規表現を作成する方法はありますか? または、私が思いつかない素晴らしいシェルコマンドはありますか?

どんな助けでも大歓迎です。

よろしく

ダーク

4

2 に答える 2

2

ldapsearchあなたが抱えている問題は、スプールの出力が別々の行にあるため、grep次のような結果になることです:

description: Joe Bloggs
mail: jbloggs@example.com

すべてのディレクトリ エントリにdescriptionandmailフィールドがあり、ldapsearch一貫してこの順序で出力されると想定できる場合は、結果をパイプすることができますgrep(sedここでは、わかりやすくするために複数の行で示しています)。

ldapsearch ... |
grep -e '^(description|mail):' |
sed -e 'N;s/description: \(.*\)\nmail: \(.*\)/\1, \2/;P;D'

このsedスクリプトは行を 2 つにグループ化し、正規表現の代替を実行して (これは必ずしも移植可能ではないため、実験が必要になる場合があることに注意してください)、フィールド名を削除し、現在のバッファーを出力して削除し、次のペアに移動できるようにします。 . によってフィールドが返される順序を気にしない魔法の正規表現を作成できるかもしれませんldapsearchが、寿命は短すぎます!

于 2012-11-02T10:43:58.633 に答える
1

思い出すと、この LDAP 出力レコードは空白行で区切られているため、次のように記述できます。

perl -00 -ne '
    /(?<=description: )(.*$)/m and print "$1, ";
    /(?<=mail: )(.*$)/m and print "$1\n";
'
于 2012-11-02T13:33:09.413 に答える