LDAP 基本ダンプ・ファイルから 6 個程度のエントリーを抽出する必要があります。
fullName:
uid:
email:
...
主に uid はファイルの複数の場所に表示されるため、検索にはコロンが必要ですが、uid: が必要です。私はコロンを避けようとしましたが、私が使用したすべての組み合わせはおそらく最初のクエリを見つけるでしょうが、2番目のクエリは見つかりません。これにより、リストに追加するアイテムが3つ以上あります。
既存の出力:
gw1:~ # cat dump2.txt|awk "/email:/" && "/fullName:/"
-bash: /fullName:/: No such file or directory
gw1:~ # cat dump2.txt|grep -e "email:" -e "fullName:"
fullName: LDAP Proxy2
fullName: Student Email Administrator
fullName: Richard C. Holly
fullName: Jene E. Brown
予想出力:
gw1:~ # cat dump2.txt|awk "/email\:/" print{','} && "/fullName\:/" print{','} && "/gid\:/"
email: [email protected] , fullName: LDAP Proxy2, gui: 987
csv形式を参照してください。
答え1
サンプル入力ファイルから始めましょう。
$ cat dump.txt
some: other
email: [email protected]
fullName: LDAP Proxy2
gui: 987
other: thing
必要な行を抽出してCSVでフォーマットを再指定するには、次の手順に従ってください。
$ awk '/email:|fullName:|gui:/{s=s", "$0} END{print substr(s,3)}' dump.txt
email: [email protected], fullName: LDAP Proxy2, gui: 987
仕組み:
/email:|fullName:|gui:/{s=s", "$0}
これは条件の後の文です。条件は、
/email:|fullName:|gui:/
探している文字列の1つを含む行にのみ適用される正規表現です。正規表現では、この|
記号は論理ORを表します。条件が true の場合、文が実行されます。このステートメントを使用すると、コンマ、スペース、および現在の行が変数に追加されます
s
。awk
ファイル内のすべての行を暗黙的に繰り返し、各行で上記の操作を実行します。END{print substr(s,3)}
入力ファイルの読み取りが完了したら、最初の2文字を除くすべての文字を印刷しようとします
s
。最初の2文字は「,」で重複しています。この機能はsubstr
それを削除するために使用されます。
サンプル出力
使用あなたが提供した文書paste.ee
コメントに指定したフィールド(「mail:」、「fullName」、「uid」)を選択すると、次の結果が表示されます。
$ awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump.txt
mail: [email protected], uid: pgroce, fullName: Patti K. Groce
すべてのフィールドが見つかりました。
空のフィールドを入力してください
コメントに従って、dump3.txt
最後に空の項目を置くことを検討してください。
$ cat dump3.txt
other: thing
mail: [email protected]
uid: pgroce
fullName: Patti K. Groce
mail:
mail:
Other: Thing
mail:
$ awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump3.txt
mail: [email protected], uid: pgroce, fullName: Patti K. Groce, mail:, mail:, mail:
お客様の要件に応じて、空のアイテムは空のアイテムとして印刷されます。
答え2
ファイル全体をPerlハッシュに解析し、必要なフィールドを印刷できます(ファイル名の後に入力引数として提供されます)。
perl -nle '
BEGIN{
$input_file = shift;
$required_fields = shift
}
my ($field,$val) = split/:/;
next unless defined $field; #Skip lines with no field names
$fields{$field} = $val;
END{
print join ",",@fields{split/,/,$required_fields}
}' your_file 'email,fullName,gui'