¿Por qué usar comillas dobles para encerrar las declaraciones de acción de awk produce resultados diferentes que cuando se usan comillas simples para encerrarlas?

8

Si uso comillas simples para encerrar la declaración de acción de awk, funciona como se esperaba:

$ 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

Pero si uso comillas dobles para encerrarlos, imprime la línea completa en lugar de la columna / campo particular:

$ 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 es esto entonces? ¿Por qué usar comillas dobles para encerrar las declaraciones de acción de awk produce resultados diferentes que cuando se usan comillas simples para encerrarlas? ¿Puedo hacer algo para que el uso de comillas dobles funcione como el uso de comillas simples?

Aditya
fuente
Intenta usar comillas simples fuera de las llaves.
Avinash Raj
@AvinashRaj Eso produciría un error de sintaxis, todas las declaraciones de acción awkdeberían estar dentro { ... }.
Aditya
¿Quién dice que crearía un error de sintaxis? Awk sysntax iba a ser así, awk 'condition1{action1} condition2 {action2}'. Si damos el comando awk de esta manera, awk '{print $1}'significa que no hay ninguna condición dada.
Avinash Raj
No dije que tu comando awk {'print $2'}está mal. Dije que sería mejor evitar las comillas simples entre llaves, porque te confundirá.
Avinash Raj
@AvinashRaj Oh ... pensé que querías decir algo más.
Aditya

Respuestas:

6

Si usa comillas dobles, $2el shell lo reemplaza antes de que awkse llame. Como $2suele estar vacío corriendo

awk {"print $2"}

es lo mismo que correr

awk {"print "}

Utilizar

awk {"print \$2"}

si quieres usar comillas dobles.

Florian Diesch
fuente
Estoy mirando los manuales como cuando se realizan expansiones de shell . No menciona nada sobre comillas simples o comillas dobles. ¿Por qué no se realiza la expansión en caso de comillas simples? ¿Y desde dónde $2se expandió bash ? (Desde entonces, estoy tratando de aprender cosas, me gustaría entender lo que está sucediendo) :)
Aditya
Oh ... encontré esto que explica la diferencia entre comillas simples y comillas dobles. Eso está claro ... Ahora, ¿de dónde sacó bash $2?
Aditya
Si está trabajando en la línea de comando, $2generalmente es una variable de entorno vacía
Florian Diesch el
De acuerdo, no sabía que no es necesario definir una variable en bash. Si bash no encuentra una variable, la expande automáticamente como vacía. Esta respuesta en Server Fault lo aclara.
Aditya