Por que o uso de aspas duplas para incluir as instruções de ação do awk produz resultados diferentes do que quando se usa aspas simples para incluí-las?

8

Se eu usar aspas simples para incluir a declaração de ação do awk, ela funcionará conforme o esperado:

$ dpkg -l | grep "linux\-[a-z]*\-" | awk {'print $2'}
linux-headers-3.13.0-27
linux-headers-3.13.0-27-generic
linux-headers-3.14.4-031404
linux-headers-3.14.4-031404-generic
linux-headers-generic
linux-image-3.13.0-27-generic
linux-image-3.14.4-031404-generic
linux-image-extra-3.13.0-27-generic
linux-image-generic
linux-libc-dev:i386
linux-sound-base

Mas se eu usar aspas duplas para incluí-las, ela imprimirá a linha inteira em vez da coluna / campo específico:

$ dpkg -l | grep "linux\-[a-z]*\-" | awk {"print $2"}
ii  linux-headers-3.13.0-27                    3.13.0-27.50                                           all          Header files related to Linux kernel version 3.13.0
ii  linux-headers-3.13.0-27-generic            3.13.0-27.50                                           i386         Linux kernel headers for version 3.13.0 on 32 bit x86 SMP
ii  linux-headers-3.14.4-031404                3.14.4-031404.201405130853                             all          Header files related to Linux kernel version 3.14.4
ii  linux-headers-3.14.4-031404-generic        3.14.4-031404.201405130853                             i386         Linux kernel headers for version 3.14.4 on 32 bit x86 SMP
ii  linux-headers-generic                      3.13.0.27.33                                           i386         Generic Linux kernel headers
ii  linux-image-3.13.0-27-generic              3.13.0-27.50                                           i386         Linux kernel image for version 3.13.0 on 32 bit x86 SMP
ii  linux-image-3.14.4-031404-generic          3.14.4-031404.201405130853                             i386         Linux kernel image for version 3.14.4 on 32 bit x86 SMP
ii  linux-image-extra-3.13.0-27-generic        3.13.0-27.50                                           i386         Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP
ii  linux-image-generic                        3.13.0.27.33                                           i386         Generic Linux kernel image
ii  linux-libc-dev:i386                        3.13.0-27.50                                           i386         Linux Kernel Headers for development
ii  linux-sound-base                           1.0.25+dfsg-0ubuntu4                                   all          base package for ALSA and OSS sound systems

Por que é tão? Por que o uso de aspas duplas para incluir as instruções de ação do awk produz resultados diferentes do que o uso de aspas simples para incluí-las? Posso fazer algo para que o fechamento usando aspas duplas funcione como o fechamento usando aspas simples?

Aditya
fonte
Tente usar aspas simples fora do aparelho.
precisa
@AvinashRaj Isso produziria um erro de sintaxe, todas as instruções de ação awkdevem estar dentro { ... }.
Aditya
quem disse que criaria erro de sintaxe? O sysntax do Awk seria assim awk 'condition1{action1} condition2 {action2}',. Se dermos o comando awk assim, awk '{print $1}'significa que não há nenhuma condição.
precisa
Eu não disse que seu comando awk {'print $2'}está errado. Eu disse que seria melhor evitar aspas simples dentro do aparelho, porque isso vai confundir você.
precisa
@AvinashRaj Oh .. eu pensei que você quis dizer outra coisa.
Aditya

Respostas:

6

Se você usar aspas duplas, as $2substituições pelo shell antes serão awkchamadas. Como $2geralmente está em execução vazia

awk {"print $2"}

é o mesmo que correr

awk {"print "}

Usar

awk {"print \$2"}

se você quiser usar aspas duplas.

Florian Diesch
fonte
Estou vendo os manuais como quando são executadas as expansões de shell . Não menciona nada sobre aspas simples ou duplas. Por que a expansão não é realizada no caso de aspas simples? E, de onde o bash $2foi expandido? (Uma vez que, eu estou tentando aprender coisas, eu gostaria de entender o que está acontecendo) :)
Aditya
Oh .. encontrei isso que explica a diferença entre aspas simples e aspas duplas. Está claro .. Agora, de onde o bash chegou $2?
Aditya
Se você estiver trabalhando na linha de comando $2é normalmente uma variável de ambiente vazio
Florian Diesch
Ok, não sabia que não é necessário definir uma variável no bash. Se o bash não encontrar uma variável, ela automaticamente será expandida como vazia. Esta resposta na falha do servidor esclarece.
Aditya