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
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?
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).
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] *) 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 }'