¿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?


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.