Como eu poderia simplificar este comando para usar somente o awk?

6
awk '/user/ {print $1 }' /etc/userdomains | sed 's/://'

o formato de / etc / userdomains é

domain.tld: user
otherdomain.tld: otheruser
    
por xenoterracide 24.10.2010 / 05:30

4 respostas

9

A maneira mais fácil é definir o separador de campo como ":"

awk -F":" '$2~/user/{print $1}' /etc/userdomains

And if you want to check for exact username, 

awk -F"[ \t]*:[ \t]*" '$2=="user"{print $1}' /etc/userdomains
    
por 24.10.2010 / 06:20
2

awk tem uma função sub(regexp, replacement, target) que localiza a primeira ocorrência de regexp em target ( $0 por padrão) e a substitui por replacement (no local):

awk '/user/ {sub(/:/, ""); print $1}' /etc/userdomains
    
por 24.10.2010 / 05:42
2

Você pode usar gsub em awk para remover todos os : s na string.

awk '/user/ {gsub(":", ""); print $1}' /etc/userdomains
    
por 24.10.2010 / 05:42
1

Você pode usar tr em vez de sed:

awk '/user/ {print $1 }' /etc/userdomains | tr -d ":"

Embora eu não veja como é melhor do que usar o awk (nem vejo o que há de errado com o sed).

    
por 24.10.2010 / 06:11