Qual o equivalente de “grep | cortar ”usando sed ou awk?

5

Digamos que eu tenha um arquivo de configuração /etc/emails.conf

email1 = [email protected] 
email2 = [email protected]
email3 = [email protected]

e eu queria receber um e-mail2

Eu poderia fazer um:

grep email2 /etc/emails.conf | cut -d'=' -f2 

para obter o e-mail2, mas como faço isso "mais legal" com um comando sed ou awk e removo o espaço em branco que o comando de corte deixaria?

    
por Peter Turner 04.05.2015 / 17:53

4 respostas

4

Que tal usar o awk?

awk -F = '/email2/ { print $2}' /etc/emails.conf
  • -F = Os campos são separados por '='

  • '/email2/ { print $2}' Nas linhas que correspondem a "email2", imprima o segundo campo

por 04.05.2015 / 17:58
4

O equivalente exato seria algo como:

sed -n '/email2/{s/^[^=]*=\([^=]*\).*//;p;}' < file

Mas você provavelmente desejaria:

sed -n 's/^[^=]*email2[^=]*=[[:blank:]]*//p' < file

(corresponde a email2 apenas na parte anterior ao primeiro = e retorna tudo à direita do primeiro = (ignorando espaços em branco à esquerda), não apenas a parte até o segundo = se qualquer).

    
por 04.05.2015 / 18:00
3
perl -nlE 's/email2\s*=\s*// and say'    file

Onde:

  • perl -nl é um para cada linha do ...
  • s/email2 = // remove o ID de e-mail pesquisado e, se você puder fazer isso ...
  • say imprime a linha de entrada de entrada atual
  • \s* zero ou mais espaços (equivalente a [\ t \ n] *)
por 04.05.2015 / 18:48
0

Não há necessidade de definir o separador de campo para nenhum valor especial, como "=". Por padrão, o AWK usa espaços e guias contíguos como separadores de campo, que são ignorados, portanto, ele interpretará cada linha do arquivo como tendo três campos, sem nenhum espaço no campo três

awk '/^email2/ { print $3 }'

produz

[email protected]

O texto acima também corresponderia a qualquer linha que comece com email2 , como email20 , para correspondência exata que você possa usar

awk '$1 == "email2" { print $3 }'
    
por 05.05.2015 / 18:20

Tags