awk在bash中不起作用-c“ somecommand | awk'{print $ 2}'”

Mar*_*ols 2 bash awk subshell

此命令按预期工作:

(dpkg -l | egrep "linux.+3.8.0.*44" | awk '{print $2}')
linux-generic-lts-raring
linux-headers-3.8.0-44
linux-headers-3.8.0-44-generic
linux-headers-generic-lts-raring
linux-image-3.8.0-44-generic
linux-image-generic-lts-raring
Run Code Online (Sandbox Code Playgroud)

但是,当我用bash -c它运行时不起作用:

bash -c "(dpkg -l | egrep "linux.+3.8.0.*44" | awk '{print $2}')"
ii  linux-generic-lts-raring         3.8.0.44.44                       Generic     Linux kernel image and headers
ii  linux-headers-3.8.0-44           3.8.0-44.66~precise1              Header files related to Linux kernel version 3.8.0
ii  linux-headers-3.8.0-44-generic   3.8.0-44.66~precise1              Linux kernel headers for version 3.8.0 on 64 bit x86 SMP
ii  linux-headers-generic-lts-raring 3.8.0.44.44                       Generic Linux kernel headers
ii  linux-image-3.8.0-44-generic     3.8.0-44.66~precise1              Linux kernel image for version 3.8.0 on 64 bit x86 SMP
ii  linux-image-generic-lts-raring   3.8.0.44.44                       Generic Linux kernel image
Run Code Online (Sandbox Code Playgroud)

我不知道为什么。好像管道破裂了。

Cha*_*ffy 5

由于您用双引号引起来,因此$2会被shell扩展,而不是直接传递给awk。而print在awk中,默认情况下,版画$0,即。整个输入行,因此,如果将其扩展为空值,则会出现问题。

bash -c "(dpkg -l | egrep 'linux.+3.8.0.*44' | awk '{print \$2}')"
Run Code Online (Sandbox Code Playgroud)

顺便说一句-没有分别使用grepawk单独使用的意义。

bash -c "dpkg -l | awk '/linux.+3.8.0.*44/ { print \$2 }'"
Run Code Online (Sandbox Code Playgroud)

如果封闭外壳本身是bash,则可以使用$''另一种方式提供文字字符串:

# $'' only works with bash, ksh, etc., but won't interpret $2, and lets
# you pass literal quotes
bash -c $'dpkg -l | awk \'/linux.+3[.]8[.]0.*44/ { print $2 }\''
Run Code Online (Sandbox Code Playgroud)

相比之下,如果封闭的外壳是基线POSIX,则在单引号字符串中包含文字单引号会变得更加复杂。

bash -c 'dpkg -l | awk '"'"'/linux.+3[.]8[.]0.*44/ { print $2 }'"'"''
Run Code Online (Sandbox Code Playgroud)