GNU/Linux >> Belajar Linux >  >> Linux

Ekstrak Nilai Antara Dua Pola Pencarian Pada Baris Yang Sama?

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 

Linux
  1. Bagaimana Cara Mengekstrak Log Antara Dua Cap Waktu?

  2. Cari File Teks Di Mana Dua Kata Berbeda Ada (Urutan apa saja, Baris Apa Saja)?

  3. Ekstrak Teks Antara Dua Baris Tertentu?

  1. Menghapus Baris Tertentu dari File di Baris Perintah Linux

  2. skrip bash menambahkan teks ke baris pertama file

  3. sed:bagaimana cara mengganti baris jika ditemukan atau ditambahkan ke akhir file jika tidak ditemukan?

  1. Cara Mengekstrak File tar.gz di Linux dengan Menggunakan Command Line

  2. Menggunakan Sed untuk Mencari &mengganti garis di antara rentang pola

  3. Menggunakan sed untuk mengganti antara pola tertentu