为什么使用双引号将 awk 的操作语句括起来与使用单引号将它们括起来会产生不同的结果?

Adi*_*tya 8 command-line awk

如果我使用单引号将 awk 的 action 语句括起来,它会按预期工作:

$ 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
Run Code Online (Sandbox Code Playgroud)

但是如果我使用双引号将它们括起来,它会打印整行而不是特定的列/字段:

$ 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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?为什么使用双引号将 awk 的操作语句括起来与使用单引号将它们括起来会产生不同的结果?我可以做一些事情,以便使用双引号括起来就像使用单引号括起来一样吗?

Flo*_*sch 6

如果您使用双引号,则会在调用$2之前awk被shell 替换。因为$2通常是空运行

awk {"print $2"}
Run Code Online (Sandbox Code Playgroud)

和跑步一样

awk {"print "}
Run Code Online (Sandbox Code Playgroud)

awk {"print \$2"}
Run Code Online (Sandbox Code Playgroud)

如果你想使用双引号。