GNU/Linux >> Linux Esercitazione >  >> Linux

Estrarre il valore tra due modelli di ricerca sulla stessa riga?

Ho quanto segue in un file Output.dat. Devo estrarre il valore tra dn: uid= e ,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
  • Ho provato a usare
    sed -e '/dn: uid=/,/,ou=/p' output.dat but
    

    restituisce la riga completa anziché il valore.

  • Quando si tenta di utilizzare
    sed -e '/dn: uid=/,/,ou=/1/p' output.dat
    

    quindi ha ottenuto il seguente errore:

    sed: -e expression #1, char 18: unknown command: `'
    

Risposta accettata:

Se hai una versione di GNU grep con PCRE (-P ) supporto, quindi supponendo che tu intenda il primo occorrenza di ,ou

grep -oP '(?<=dn: uid=).+?(?=,ou=)' file

Se vuoi abbinare fino al secondo ,ou puoi rimuovere il ? non avido modificatore

grep -oP '(?<=dn: uid=).+(?=,ou=)' file

Le espressioni tra parentesi sono asserzioni a lunghezza zero (ovvero lookaround ) significa che fanno parte della corrispondenza, ma non vengono restituiti come parte del risultato. Potresti fare la stessa cosa in modo nativo in perl, ad es.

perl -ne 'print "$1n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file 

È possibile fare qualcosa di simile in sed, usando il raggruppamento regolare (di lunghezza diversa da zero), ad es. (per GNU sed – altre varietà potrebbero aver bisogno di un'escape aggiuntivo)

sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)/2/p' file

o semplificando leggermente

sed -rn 's/.*dn: uid=([^,]+),ou=.*/1/p' file

Nota il [^,] è un po' un trucco qui, dal momento che sed non ha una vera opzione di corrispondenza non avida.

Ripensamento :anche se non è esattamente quello che hai chiesto, sembra che quello che vuoi fare sia leggere name=value separati da virgole coppie da un file, quindi dividere ulteriormente il valore del primo campo dal suo nome. Potresti ottenerlo in molti modi, incluso

awk -F, '{sub(".*=","",$1); print $1}' file

o una soluzione pure-bash come

while IFS=, read -r a b c d; do printf '%sn' "${a#*=}"; done < file 

Linux
  1. Stampa linee tra (ed escludendo) due motivi?

  2. Stampa linee tra (e inclusi) due motivi?

  3. Come inserire del testo prima della prima riga di un file?

  4. Come sostituire il testo come sed con python?

  5. lo script bash aggiunge il testo alla prima riga di un file

Come rimuovere le righe da un file usando il comando Sed

Come estrarre il file Tar.xz sulla riga di comando di Linux

Esercitazione Unix Sed:stampa di righe di file utilizzando l'indirizzo e i modelli

Come inserisco il testo nella prima riga di un file usando sed?

Scripting:qual è il modo più semplice per estrarre un valore in un tag di un file XML?

Differenza negli spazi bianchi tra due file su Linux