Alguém poderia explicar o que está acontecendo com o awk
comando abaixo? 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 fechado, ...}
preciso fechar com aspas ...}'
?
$ awk '{print "me "$0 '"notme"} <<<"printme"
me printme
Então eu tentaria 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 de comandos do shell.
Isso é um inseto? Ou talvez um estado especial que não consigo encontrar.
Para o primeiro
O que está acontecendo aqui é:
awk
textualmente"notme"}
é analisada pelo shell e então passadaawk
como a string resultantenotme}
awk
dá para ver isso:Como a
awk
variávelnotme
não tem valor, é isso que você obtémPara o segundo
Eu estaria mais inclinado a escrever assim, usando uma
awk
variável para carregar o valor de$(date)
:Você perguntou por que não há erro de sintaxe em sua versão deste. Vamos desmontá-lo:
A string entre aspas duplas
"\"$(date)\""
é analisada pelo shell antes deawk
chegar perto dela e é avaliada (pelo shell) como algo parecido com 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 tanto tortuoso de ler.A aspa simples termina a string que delimita o
awk
programa no shell.awk
ela mesma nunca a verá. Você então concatena essa parte inicial do programa com mais strings fornecidas por substituições de comando e strings estáticas no shell. Isso tudo acontece antesawk
de ser invocado.É claro que você pode usar substituições de comando para modificar uma string que mais tarde é lida
awk
como seu código, mas isso 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 apenas definir uma
awk
variável da maneira usual: