awk
pode acessar variáveis de ambiente usando a matriz ENVIRON
special. No entanto, embora seja possível atribuir valores a elementos dessa matriz, eles não são transmitidos no ambiente dos comandos executados por awk
system
, | getline
ou print |
. Esse ENVIRON
array é destinado apenas para awk
para obter o valor das variáveis de ambiente para as quais foi passado.
Você pode fazer: system("ls " var)
, mas esteja ciente de que a string passada para awk
' system()
' (ou print |
ou | getline
) é passada como argumento para sh -c
, portanto é interpretado como código shell.
Por exemplo, se a variável awk
var
contiver foo;rm -rf /
, ela não informará ls
para listar o arquivo chamado "foo;rm -rf /"
, mas listará o arquivo chamado foo
e, em seguida, rm
comando será executado.
Então, você pode precisar escapar de todos os caracteres especiais para o shell nessa variável var
.
Isso pode ser feito, por exemplo, com:
awk '
function escape(s) {
gsub(/'\''/, "&\\&&", s)
return "'\''" s "'\''"
}
{
cmd = "date -d " escape($0) " +%s"
cmd | getline seconds
close(cmd)
print seconds
}'
Embora isso signifique executar um shell e um comando date
por linha, é melhor que você faça a leitura do arquivo com o próprio shell:
while IFS= read <&3 -r line; do
date -d "$line" +%s
done 3< the-file