bash - awk 在 bash -c "somecommand | awk ' {print $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

但是,当我使用 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

我不知道为什么。就好像管道正在破裂一样。

最佳答案

因为你在双引号中,$2 被 shell 扩展了,而不是直接传递给 awk。而 awk 中的 print 默认打印 $0,即。整行输入,所以如果它扩展为一个空值,那就是你的问题。

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

顺便说一句——没有必要分别使用 grepawk

bash -c "dpkg -l | awk '/linux.+3.8.0.*44/ { print \$2 }'"

如果您的封闭 shell 本身就是 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 }\''

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

bash -c 'dpkg -l | awk '"'"'/linux.+3[.]8[.]0.*44/ { print $2 }'"'"''

关于bash - awk 在 bash -c "somecommand | awk ' {print $2 }'"中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40533400/

相关文章:

当调用 subshel​​l 时,Bash while 循环在第一次迭代后停止

Bash:命令在子 shell 中用花括号分组

bash - 获取 "sed error - illegal byte sequence"(在 bash 中)

python - 计算并发事件的数量

bash - bash 中的 errexit 问题

linux - 为什么我的 awk 命令多打印一行?

linux - 如何在awk中将文件的列名作为变量传递

linux - 使用 grep 查找文本,如果在文件中找到回显该文件中的另一个字符串

bash - 使用 shell 更新终端上显示的最后两行?

bash - 在 awk 中使用多个分隔符