次の出力を含むファイルがあります。
dn: rdcPosition がある場合があります。
acme#6# を含む rdcPositions を持つ dn: のみが必要です。
結果はcnとrdcPositionを印刷する必要があります。
dn: cn=00fa69bd-bede-4918-a017-b59b0901bb3d,ou=Named,ou=Identities,ou=Active,o
u=Vault,o=acme
rdcPosition: cn=1950,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>8946
702990</cn><reqdate>1529318977</reqdate><startdate>1529318977</startdate><end
date>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>1</ne
wstatus><date>1529318977</date></change><change><date>1529319116</date><previ
ousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>15
29481285</date><previousstatus>3</previousstatus><newstatus>6</newstatus></ch
ange></lifecycle></position>
dn: cn=010903cd-e92d-4307-bffc-4921379153c0,ou=Named,ou=Identities,ou=Active,o
u=Vault,o=acme
rdcPosition: cn=922445,ou=Entities,ou=Active,ou=Vault,o=acme#5#<position><cn>42
79084890</cn><reqdate>1429014997</reqdate><startdate>1429014997</startdate><e
nddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>1</
newstatus><date>1429014997</date></change><change><date>1429023084</date><pre
viousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>
1525107741</date><previousstatus>3</previousstatus><newstatus>6</newstatus></
change><change><date>1525126716</date><previousstatus>6</previousstatus><news
tatus>5</newstatus></change></lifecycle></position>
rdcPosition: cn=311982,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>97
26910833</cn><reqdate>1528120494</reqdate><startdate>1528120494</startdate><e
nddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>1</
newstatus><date>1528120494</date></change><change><date>1528123478</date><pre
viousstatus>1</previousstatus><newstatus>3</newstatus></change></lifecycle></
position>
dn: cn=01126aa4-af80-401b-8713-29e360868999,ou=Named,ou=Identities,ou=Active,o
u=Vault,o=acme
rdcPosition: cn=914570,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>20
68839799</cn><reqdate>1406284665</reqdate><startdate>1406284665</startdate><e
nddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>0</
newstatus><date>1406284665</date></change><change><date>1406284666</date><pre
viousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>
1435847283</date><previousstatus>3</previousstatus><newstatus>6</newstatus></
change></lifecycle></position>
rdcPosition: cn=999546,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>76
03071057</cn><reqdate>1400325753</reqdate><startdate>1400325753</startdate><e
nddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>0</
newstatus><date>1400325753</date></change><change><date>1400325754</date><pre
viousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>
1449224475</date><previousstatus>3</previousstatus><newstatus>6</newstatus></
change></lifecycle></position>
rdcPosition: cn=3513,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>2802
042129</cn><reqdate>1406284761</reqdate><startdate>1406284761</startdate><end
date>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>0</ne
wstatus><date>1406284761</date></change><change><date>1406284762</date><previ
ousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>14
49224599</date><previousstatus>3</previousstatus><newstatus>6</newstatus></ch
ange></lifecycle></position>
rdcPosition: cn=312936,ou=Entities,ou=Active,ou=Vault,o=acme#3#<position><cn>19
23461515</cn><reqdate>1449217172</reqdate><startdate>1449217172</startdate><e
nddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>1</
newstatus><date>1449217172</date></change><change><date>1449225081</date><pre
viousstatus>1</previousstatus><newstatus>3</newstatus></change></lifecycle></
position>
答え1
入力は、次のようにLDIFとして表示されます。RFC 2849。
私は強くお勧めしますいいえLDIF 処理に一般的に使用される awk/sed/grep ツールチェーンを使用する理由は次のとおりです。
- 長い属性値行(dn:を含む)は、行の連続を示すために単一のスペースで囲まれています。
- 非ASCII文字を含む属性値はbase64でエンコードされます。
最善の解決策は、好みのスクリプト言語に適したLDIFパーサーを使用することです。
ldif
たとえば、Pythonの場合は、python-ldapのモジュールを使用します。
ドキュメントを参照してください。ldif – LDIFパーサーとジェネレータ
答え2
目的の出力が何であるかは不明です。これはあなたにどれだけ役立つでしょうか?
awk '
{while (match($0, /rdcPosition: [^ ]*acme#6#[^ ]*/)) {print substr ($0, RSTART, RLENGTH)
$0 = substr ($0, RSTART + RLENGTH);
}
}
' file
rdcPosition: cn=1950,ou=Entities,ou=Active,ou=Vault,o=acme#6#8946
rdcPosition: cn=311982,ou=Entities,ou=Active,ou=Vault,o=acme#6#97
rdcPosition: cn=914570,ou=Entities,ou=Active,ou=Vault,o=acme#6#20
rdcPosition: cn=999546,ou=Entities,ou=Active,ou=Vault,o=acme#6#76
rdcPosition: cn=3513,ou=Entities,ou=Active,ou=Vault,o=acme#6#2802
コメント変更リクエストはどのくらい役に立ちますか?満足できない場合は、必要な出力をより具体的に定義してください。
awk '
{DN = $1 FS $2
while (match($0, /rdcPosition: [^ ]*acme#6#[^ ]*/)) {print DN, substr ($0, RSTART, RLENGTH)
$0 = substr ($0, RSTART + RLENGTH);
}
}
' file
dn: cn=00fa69bd-bede-4918-a017-b59b0901bb3d,ou=Named,ou=Identities,ou=Active,ou=Vault,o=acme rdcPosition: cn=1950,ou=Entities,ou=Active,ou=Vault,o=acme#6#8946
dn: cn=010903cd-e92d-4307-bffc-4921379153c0,ou=Named,ou=Identities,ou=Active,ou=Vault,o=acme rdcPosition: cn=311982,ou=Entities,ou=Active,ou=Vault,o=acme#6#97
dn: cn=01126aa4-af80-401b-8713-29e360868999,ou=Named,ou=Identities,ou=Active,ou=Vault,o=acme rdcPosition: cn=914570,ou=Entities,ou=Active,ou=Vault,o=acme#6#20
dn: cn=01126aa4-af80-401b-8713-29e360868999,ou=Named,ou=Identities,ou=Active,ou=Vault,o=acme rdcPosition: cn=999546,ou=Entities,ou=Active,ou=Vault,o=acme#6#76
dn: cn=01126aa4-af80-401b-8713-29e360868999,ou=Named,ou=Identities,ou=Active,ou=Vault,o=acme rdcPosition: cn=3513,ou=Entities,ou=Active,ou=Vault,o=acme#6#2802
答え3
次のsed
スクリプトを使用してください(を使用して実行すると仮定sed -n
)。
/^dn:/{ # this is a "dn" line
N; # append the next line
s/\n //; # remove the newline and the space
x; # exchange pattern space with hold space
/o=acme#6#/p; # print if pattern space contains our string
d; # delete from pattern space, start next cycle
}
/^rdcPosition:/{ # this is a "rdcPosition" line
:again; # define label for loop
N; # append the next line
s/\n //; # remove the newline and the space
\#</position>#!b again; # if the end tag "</position>" was not read, loop
/o=acme#6#/H; # append to hold space if matching what we're looking for
}
${ # at the very end of input
x; # exchange pattern and hold space
/o=acme#6#/p; # print if pattern space contains our string
}
sed
このスクリプトが行うことは、基本的に「予約済みスペース」(サイクル間に予約された汎用バッファ)に文字列を作成することです。文字列はdn
その行から始まり、rdcPosition
関心のある特定の文字列を含む行を追加します。
新しいdn
行が見つかるか、入力が終わるたびに予約済みスペースに文字列が含まれている場合は条件付きで印刷します(rdcPosition
現在のdn
行に一致する行がない場合は含まれない可能性があります)。
テストしてみてください:
$ sed -n -f script.sed file
dn: cn=00fa69bd-bede-4918-a017b59b0901bb3d,ou=Named,ou=Identities,ou=Active,ou=Vault,o=acme
rdcPosition: cn=1950,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>8946702990</cn><reqdate>1529318977</reqdate><startdate>1529318977</startdate><enddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>1</newstatus><date>1529318977</date></change><change><date>1529319116</date><previousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>1529481285</date><previousstatus>3</previousstatus><newstatus>6</newstatus></change></lifecycle></position>
dn: cn=010903cd-e92d-4307-bffc-4921379153c0,ou=Named,ou=Identities,ou=Active,ou=Vault,o=acme
rdcPosition: cn=311982,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>9726910833</cn><reqdate>1528120494</reqdate><startdate>1528120494</startdate><enddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>1</newstatus><date>1528120494</date></change><change><date>1528123478</date><previousstatus>1</previousstatus><newstatus>3</newstatus></change></lifecycle></position>
dn: cn=01126aa4-af80-401b-8713-29e360868999,ou=Named,ou=Identities,ou=Active,ou=Vault,o=acme
rdcPosition: cn=914570,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>2068839799</cn><reqdate>1406284665</reqdate><startdate>1406284665</startdate><enddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>0</newstatus><date>1406284665</date></change><change><date>1406284666</date><previousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>1435847283</date><previousstatus>3</previousstatus><newstatus>6</newstatus></change></lifecycle></position>
rdcPosition: cn=999546,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>7603071057</cn><reqdate>1400325753</reqdate><startdate>1400325753</startdate><enddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>0</newstatus><date>1400325753</date></change><change><date>1400325754</date><previousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>1449224475</date><previousstatus>3</previousstatus><newstatus>6</newstatus></change></lifecycle></position>
rdcPosition: cn=3513,ou=Entities,ou=Active,ou=Vault,o=acme#6#<position><cn>2802042129</cn><reqdate>1406284761</reqdate><startdate>1406284761</startdate><enddate>1924902000</enddate><lifecycle><change><previousstatus/><newstatus>0</newstatus><date>1406284761</date></change><change><date>1406284762</date><previousstatus>1</previousstatus><newstatus>3</newstatus></change><change><date>1449224599</date><previousstatus>3</previousstatus><newstatus>6</newstatus></change></lifecycle></position>
awk
上記のコードと同じ出力を生成する論理的に同等のスクリプト:sed
/^dn:/ {
if (hold ~ "o=acme#6#")
print hold
hold = $0;
getline
hold = hold substr($0, 2)
next
}
/^rdcPosition:/ {
line = $0
while (line !~ "</position>") {
getline
line = line substr($0, 2)
}
if (line ~ "o=acme#6#")
hold = hold ORS line
}
END {
if (hold ~ "o=acme#6#")
print hold
}
これらのsubstr($0, 2)
呼び出しは、入力の区切り線から先行スペースを削除します。
どちらのスクリプトも、その行dn
が正確に2行に分割されていると仮定します。