Pourquoi l'utilisation de guillemets doubles pour entourer les instructions d'action awk produit-elle des résultats différents que lorsque vous utilisez des guillemets simples pour les entourer?

8

Si j'utilise des guillemets simples pour inclure l'instruction d'action awk, cela fonctionne comme prévu:

$ 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

Mais si j'utilise des guillemets doubles pour les entourer, il imprime la ligne entière au lieu de la colonne / du champ particulier:

$ 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

Pourquoi en est-il ainsi? Pourquoi l'utilisation de guillemets doubles pour entourer les instructions d'action awk produit-elle des résultats différents que lorsque vous utilisez des guillemets simples pour les entourer? Puis-je faire quelque chose pour que la mise en boîte avec des guillemets doubles fonctionne comme la mise en boîte avec des guillemets simples?

Aditya
la source
Essayez d'utiliser des guillemets simples en dehors des accolades.
Avinash Raj
@AvinashRaj Cela produirait une erreur de syntaxe, toutes les instructions d'action dans awkdevraient être à l'intérieur { ... }.
Aditya
qui a dit que cela créerait une erreur de syntaxe? Serait comme awk sysntax cela, awk 'condition1{action1} condition2 {action2}'. Si nous donnons la commande awk comme ceci awk '{print $1}', cela signifie qu'aucune condition n'est donnée.
Avinash Raj
je n'ai pas dit que votre commande awk {'print $2'}était fausse. J'ai dit qu'il valait mieux éviter les guillemets simples entre accolades, car cela vous embrouillerait.
Avinash Raj
@AvinashRaj Oh .. Je pensais que tu voulais dire autre chose.
Aditya

Réponses:

6

Si vous utilisez des guillemets doubles, le $2obtient remplacé par le shell avant awkest appelé. Comme $2c'est généralement vide en cours d'exécution

awk {"print $2"}

équivaut à courir

awk {"print "}

Utilisation

awk {"print \$2"}

si vous souhaitez utiliser des guillemets doubles.

Florian Diesch
la source
Je regarde les manuels comme quand sont effectuées les extensions de shell . Il ne mentionne rien sur les guillemets simples ou doubles. Pourquoi l'expansion n'est-elle pas effectuée en cas de guillemets simples? Et, d'où bash a-t-il pu $2être développé? (Depuis, j'essaie d'apprendre des choses, j'aimerais comprendre ce qui se passe) :)
Aditya
Oh .. j'ai trouvé cela qui explique la différence entre les guillemets simples et les guillemets doubles. C'est clair .. Maintenant, d'où est venu bash $2?
Aditya
Si vous travaillez sur la ligne de commande $2est généralement une variable d'environnement vide
Florian Diesch
D'accord, je ne savais pas qu'il n'était pas nécessaire de définir une variable dans bash. Si bash ne trouve pas de variable, il la développe automatiquement comme vide. Cette réponse sur Server Fault l' efface.
Aditya