Saya memiliki yang berikut ini dalam file Output.dat. Saya perlu mengekstrak nilai antara dn: uid=
dan ,ou=
dn: uid=user1,ou=Active,ou=Member,dc=domain,dc=org
dn: [email protected],ou=Active,ou=Member,dc=domain,dc=org
dn: uid=usertest,ou=Active,ou=Member,dc=domain,dc=org
dn: uid=abc1,ou=Active,ou=Member,dc=domain,dc=org
- Saya mencoba menggunakan
sed -e '/dn: uid=/,/,ou=/p' output.dat but
ia mengembalikan baris lengkap alih-alih nilai.
- Saat mencoba menggunakan
sed -e '/dn: uid=/,/,ou=/1/p' output.dat
kemudian mendapat kesalahan berikut:
sed: -e expression #1, char 18: unknown command: `'
Jawaban yang Diterima:
Jika Anda memiliki versi grep GNU dengan PCRE (-P
) dukungan, maka dengan asumsi yang Anda maksud adalah pertama terjadinya ,ou
grep -oP '(?<=dn: uid=).+?(?=,ou=)' file
Jika Anda ingin mencocokkan kedua ,ou
Anda dapat menghapus ?
pengubah
grep -oP '(?<=dn: uid=).+(?=,ou=)' file
Ekspresi dalam tanda kurung adalah pernyataan tanpa panjang (alias lookarounds ) yang berarti bahwa mereka merupakan bagian dari pertandingan, tetapi tidak dikembalikan sebagai bagian dari hasil. Anda dapat melakukan hal yang sama secara native di perl mis.
perl -ne 'print "$1n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file
Dimungkinkan untuk melakukan sesuatu yang mirip di sed, menggunakan pengelompokan reguler (tidak panjang nol) mis. (untuk GNU sed – varietas lain mungkin memerlukan pelolosan tambahan)
sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)/2/p' file
atau menyederhanakan sedikit
sed -rn 's/.*dn: uid=([^,]+),ou=.*/1/p' file
Perhatikan [^,]
adalah sedikit peretasan di sini, karena sed tidak memiliki opsi pencocokan yang benar-benar tidak serakah.
Rencana :meskipun bukan itu yang Anda minta, sepertinya yang sebenarnya ingin Anda lakukan adalah membaca name=value
yang dipisahkan koma pasang dari file, dan kemudian lebih jauh membagi nilai bidang pertama dari namanya. Anda dapat mencapainya dengan banyak cara – termasuk
awk -F, '{sub(".*=","",$1); print $1}' file
atau solusi bash murni seperti
while IFS=, read -r a b c d; do printf '%sn' "${a#*=}"; done < file