Почему использование двойных кавычек для включения операторов действия в awk дает результаты, отличные от использования одинарных кавычек для их заключения?

8

Если я использую одинарные кавычки для включения оператора действия awk, он будет работать как положено:

$ 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

Но если я использую двойные кавычки, чтобы заключить их, он печатает всю строку вместо конкретного столбца / поля:

$ 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

Почему это так? Почему использование двойных кавычек для включения операторов действия в awk дает результаты, отличные от использования одинарных кавычек для их заключения? Могу ли я сделать что-то, чтобы заключение в двойные кавычки работало так же, как вхождение в одинарные кавычки?

Адитья
источник
Попробуйте использовать одинарные кавычки за пределами фигурных скобок.
Авинаш Радж
@AvinashRaj Это приведет к синтаксической ошибке, все операторы действия awkдолжны быть внутри { ... }.
Адитья
кто сказал, что это создаст синтаксическую ошибку? Awk Sysntax будет так awk 'condition1{action1} condition2 {action2}'. Если мы дадим команду awk, как это, это awk '{print $1}'означает, что условия не заданы.
Авинаш Радж
я не говорил, что твоя команда awk {'print $2'}неверна. Я сказал, что было бы лучше избегать одинарных кавычек внутри фигурных скобок, потому что это вас запутает.
Авинаш Радж
@AvinashRaj Ох .. Я думал, ты имел в виду что-то еще.
Адитья

Ответы:

6

Если вы используете двойные кавычки, get $2будет заменен оболочкой перед awkвызовом. Как $2обычно пустой бег

awk {"print $2"}

так же, как бег

awk {"print "}

использование

awk {"print \$2"}

если вы хотите использовать двойные кавычки.

Флориан Диш
источник
Я смотрю на руководства, когда выполняются расширения оболочки . Ничего не говорится о одинарных или двойных кавычках. Почему расширение не выполняется в случае одинарных кавычек? И откуда взялся bash $2? (Так как я пытаюсь что-то узнать, я бы хотел понять, что происходит) :)
Aditya
Ох .. нашел это, что объясняет разницу между одинарными и двойными кавычками. Понятно .. Откуда взялся Баш $2?
Адитья
Если вы работаете в командной строке $2, обычно это пустая переменная окружения
Флориан Диш,
Ладно, не знал, что не нужно определять переменную в bash. Если bash не находит переменную, он автоматически расширяет ее как пустую. Этот ответ о сбое сервера очищает его.
Адитья