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?
command-line
awk
Aditya
fuente
fuente
awk
deberían estar dentro{ ... }
.awk 'condition1{action1} condition2 {action2}'
. Si damos el comando awk de esta manera,awk '{print $1}'
significa que no hay ninguna condición dada.awk {'print $2'}
está mal. Dije que sería mejor evitar las comillas simples entre llaves, porque te confundirá.Respuestas:
Si usa comillas dobles,
$2
el shell lo reemplaza antes de queawk
se llame. Como$2
suele estar vacío corriendoes lo mismo que correr
Utilizar
si quieres usar comillas dobles.
fuente
$2
se expandió bash ? (Desde entonces, estoy tratando de aprender cosas, me gustaría entender lo que está sucediendo) :)$2
?$2
generalmente es una variable de entorno vacía