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


8

如果我使用单引号将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

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

$ 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的动作语句括起来与使用单引号将它们括起来相比会产生不同的结果?我可以做些什么,以便使用双引号将其括起来与使用单引号将其括起来吗?


尝试在花括号外使用单引号。
Avinash Raj

@AvinashRaj会产生语法错误,其中的所有动作语句awk都应在内{ ... }
Aditya 2014年

谁说会产生语法错误?Awk sysntax应该是这样的awk 'condition1{action1} condition2 {action2}'。如果我们这样给出awk命令awk '{print $1}',则意味着没有条件。
Avinash Raj

我不是说你的命令awk {'print $2'}是错误的。我说过,最好避免在括号内使用单引号,因为这会使您感到困惑。
Avinash Raj

@AvinashRaj哦..我还以为你是别的意思。
Aditya 2014年

Answers:


6

如果使用双引号,则将$2gets替换为shell before awk。由于$2通常是空运转

awk {"print $2"}

和跑步一样

awk {"print "}

采用

awk {"print \$2"}

如果要使用双引号。


我正在查看手册,就像何时执行外壳扩展一样。它没有提及单引号或双引号。为什么在单引号的情况下不执行扩展?而且,bash从何而来$2?(因为我正在尝试学习东西,所以我想了解正在发生的事情:)
Aditya 2014年

哦.. 发现这一点可以解释单引号和双引号之间的区别。很清楚..现在,bash从哪里得到$2
Aditya 2014年

如果您在命令行上工作,$2通常是一个空的环境变量
Florian Diesch 2014年

好的,不知道没有必要在bash中定义变量。如果bash找不到变量,它将自动将其扩展为空。服务器故障的此答案将其清除。
Aditya 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.