Aspas simples no awk

6

Alguém poderia explicar o que está acontecendo com o comando abaixo awk ? se não houver erro, por que notme não está sendo impresso, e por que não estou recebendo erro de sintaxe, então para colchete de fechamento ...} precisa fechar com aspas ...}' ?

$ awk '{print "me "$0 '"notme"} <<<"printme"
me printme

Então eu tentei isso:

$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018

Ou

awk '{print '"\"$(date)\""} <<<"run"
Wed Apr 11 16:56:38 DST 2018

O que, como mostra, significa que posso fazer tudo usando a substituição do comando shell.

Isso é um bug? Ou talvez um estado especial que não consigo encontrar.

    
por αғsнιη 11.04.2018 / 14:29

2 respostas

7

Para o primeiro

$ awk '{print "me "$0 '"notme"} <<<"printme"

O que está acontecendo aqui é:

  1. A parte entre aspas simples é passada para awk verbatim
  2. A próxima parte "notme"} é analisada pelo shell e depois passada para awk como a string resultante notme}
  3. awk consegue ver isto:

    {print "me "$0 notme}
    

    Como o awk variable notme não tem valor, é isso que você obtém

Para o segundo

$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018

Eu estaria mais inclinado a escrevê-lo assim, usando uma variável awk para carregar o valor de $(date) :

awk -v date="$(date)" '{print "me "$0 date}' <<<"printme-at "
me printme-at Wed Apr 11 13:43:31 BST 2018

Você perguntou por que não há erro de sintaxe na sua versão deste. Vamos desmontar:

# typed at the shell
awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "

# prepared for awk
awk '{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}' <<<"printme-at "

# seen by awk
{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}

A string com aspas duplas "\"$(date)\"" é analisada pelo shell antes de awk chegar perto dele e é avaliada (pelo shell) como algo como a string literal "Wed Apr 11 13:43:31 BST 2018" (incluindo as aspas duplas) . Não vejo por que precisa haver um erro de sintaxe, pois o que você escreveu é válido - embora um pouco tortuoso para ser lido.

    
por 11.04.2018 / 14:41
2

A aspa simples termina a string que delimita o programa awk no shell. awk em si nunca o verá. Você então concatena essa parte inicial do programa com mais strings fornecidas por substituições de comandos e strings estáticas no shell. Isso tudo acontece antes que awk tenha sido chamado.

É claro que você pode usar substituições de comandos para modificar uma string que depois é lida por awk como seu código, mas não facilita a leitura do código, e pode ser bastante frágil em relação às regras de citação do shell , divisão de palavras, etc.

Seria melhor definir apenas uma variável awk da maneira usual:

awk -v thedate="$(date)" '{ print $0, thedate }'  <<<"something"
    
por 11.04.2018 / 14:43

Tags