GNU/Linux >> Znalost Linux >  >> Linux

Extrahovat hodnotu mezi dvěma vyhledávacími vzory na stejném řádku?

V souboru Output.dat mám následující. Potřebuji extrahovat hodnotu mezi dn: uid= a ,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
  • Zkoušel jsem použít
    sed -e '/dn: uid=/,/,ou=/p' output.dat but
    

    vrací celý řádek místo hodnoty.

  • Při pokusu o použití
    sed -e '/dn: uid=/,/,ou=/1/p' output.dat
    

    pak došlo k následující chybě:

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

Přijatá odpověď:

Pokud máte verzi GNU grep s PCRE (-P ) podporu, pak za předpokladu, že máte na mysli první výskyt ,ou

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

Pokud se chcete shodovat do druhé ,ou můžete odstranit nenasytný ? modifikátor

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

Výrazy v závorkách jsou tvrzení s nulovou délkou (neboli rozhledy ), což znamená, že tvoří součást zápasu, ale nejsou vráceny jako součást výsledku. Totéž můžete udělat nativně v perlu, např.

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

Je možné udělat něco podobného v sed, pomocí pravidelného seskupení (bez nulové délky), např. (pro GNU sed – jiné odrůdy mohou vyžadovat další escapování)

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

nebo mírné zjednodušení

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

Všimněte si [^,] je zde trochu hack, protože sed nemá možnost skutečného nenasytného shody.

Následný nápad :ačkoli to není přesně to, na co jste se ptali, vypadá to, že to, co ve skutečnosti chcete udělat, je číst name=value oddělené čárkami páry ze souboru a poté dále oddělit hodnotu prvního pole od jeho názvu. Můžete toho dosáhnout mnoha způsoby – včetně

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

nebo čistě bash řešení, jako je

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

Linux
  1. Pomocí Sed k vyhledání a nahrazení čáry mezi rozsahy vzorů

  2. Jak extrahovat protokoly mezi dvěma časovými razítky?

  3. Odstranění konkrétních řádků ze souboru v příkazovém řádku Linuxu

  1. Jak nahradit text podobný sedu pythonem?

  2. Jak vložím text do 1. řádku souboru pomocí sed?

  3. Skriptování:co je nejjednodušší extrahovat hodnotu ze značky souboru XML?

  1. Jak extrahovat soubor tar.gz v Linuxu pomocí příkazového řádku

  2. Tisknout čáry mezi (a vyjma) dvěma vzory?

  3. Použití sed k nahrazení mezi konkrétním vzorem