Warum führt die Verwendung von doppelten Anführungszeichen zum Einschließen der Aktionsanweisungen von awk zu anderen Ergebnissen als die Verwendung von einfachen Anführungszeichen zum Einschließen?

8

Wenn ich einfache Anführungszeichen verwende, um die Aktionsanweisung von awk einzuschließen, funktioniert dies wie erwartet:

$ 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

Wenn ich sie jedoch in doppelte Anführungszeichen setze, wird die gesamte Zeile anstelle der jeweiligen Spalte / des Felds gedruckt:

$ 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

Wieso ist es so? Warum führt die Verwendung von doppelten Anführungszeichen zum Einschließen der Aktionsanweisungen von awk zu anderen Ergebnissen als die Verwendung von einfachen Anführungszeichen zum Einschließen? Kann ich etwas tun, damit das Einschließen mit doppelten Anführungszeichen wie das Einschließen mit einfachen Anführungszeichen funktioniert?

Aditya
quelle
Versuchen Sie, einfache Anführungszeichen außerhalb der geschweiften Klammern zu verwenden.
Avinash Raj
@AvinashRaj Das würde einen Syntaxfehler erzeugen, alle Aktionsanweisungen in awksollten innerhalb sein { ... }.
Aditya
Wer sagt, dass dies zu einem Syntaxfehler führen würde? Awk sysntax wäre so , awk 'condition1{action1} condition2 {action2}'. Wenn wir den Befehl awk so geben, awk '{print $1}'bedeutet dies , dass keine Bedingung gegeben ist.
Avinash Raj
Ich habe nicht gesagt, dass dein Befehl awk {'print $2'}falsch ist. Ich sagte, es wäre besser, einfache Anführungszeichen in geschweiften Klammern zu vermeiden, da dies Sie verwirren würde.
Avinash Raj
@AvinashRaj Oh .. ich dachte du meinst etwas anderes.
Aditya

Antworten:

6

Wenn Sie doppelte Anführungszeichen verwenden, $2wird das zuvor durch die Shell ersetzte awkaufgerufen. Da $2läuft normalerweise leer

awk {"print $2"}

ist das gleiche wie laufen

awk {"print "}

Verwenden

awk {"print \$2"}

Wenn Sie doppelte Anführungszeichen verwenden möchten.

Florian Diesch
quelle
Ich betrachte die Handbücher als den Zeitpunkt, zu dem Shell-Erweiterungen durchgeführt werden . Es wird nichts über einfache oder doppelte Anführungszeichen erwähnt. Warum wird bei einfachen Anführungszeichen keine Erweiterung durchgeführt? Und woher kam Bash, $2um erweitert zu werden? (Da ich versuche, Dinge zu lernen, möchte ich verstehen, was passiert) :)
Aditya
Oh .. fand dies, was den Unterschied zwischen einfachen und doppelten Anführungszeichen erklärt. Das ist klar. Woher kam Bash $2?
Aditya
Wenn Sie an der Befehlszeile arbeiten, $2ist normalerweise eine leere Umgebungsvariable
Florian Diesch
Okay, wusste nicht, dass es nicht notwendig ist, eine Variable in bash zu definieren. Wenn bash keine Variable findet, wird sie automatisch als leer erweitert. Diese Antwort auf Server Fault löscht es.
Aditya