Chamadas do sistema, AWK e entrada externa

4
awk '{ TEMPVAR="/usr/bin"; printf("%s", system("ls $TEMPVAR")); }' empty

Neste exemplo, estou tentando trazer a variável TEMPVAR para a chamada system . Como eu faria isso?

O que eu pretendo fazer: Estou tentando usar date -d $0 +%s em uma chamada system que ocorre em todas as linhas de um arquivo. No entanto, estou com dificuldades para obter esse valor de $0 na chamada do sistema.

    
por monksy 08.02.2013 / 20:59

2 respostas

8

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
    
por 08.02.2013 / 22:11
0

Se você está passando uma variável Awk para system , você precisa fazer um shell para citá-la:

function quote(str,   d, m, x, y, z) {
  d = ""; m = split(str, x, d)
  for (y in x) z = z d x[y] d (y < m ? "\" d : "")
  return z
}

Exemplo:

system(sprintf("date -d %s +%%s", quote($0)))

Origem

    
por 15.01.2017 / 08:10