awk 在 bash -c "somecommand | awk '{print }'" 中不工作
awk not working in bash -c "somecommand | awk '{print $2}'"
此命令按预期工作:
(dpkg -l | egrep "linux.+3.8.0.*44" | awk '{print }')
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 }')"
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
我不知道为什么。就好像水管要断了一样。
因为你在双引号中,</code> 被 shell 扩展,而不是直接传递给 <code>awk
。而 awk 中的 print
默认打印 [=17=]
,即。整行输入,所以如果它扩展为一个空值,那就是你的问题。
bash -c "(dpkg -l | egrep 'linux.+3.8.0.*44' | awk '{print $2}')"
顺便说一句——没有必要分别使用 grep
和 awk
。
bash -c "dpkg -l | awk '/linux.+3.8.0.*44/ { print $2 }'"
如果封闭 shell 本身就是 bash,那么可以使用 $''
作为提供文字字符串的另一种方式:
# $'' only works with bash, ksh, etc., but won't interpret , and lets
# you pass literal quotes
bash -c $'dpkg -l | awk \'/linux.+3[.]8[.]0.*44/ { print }\''
相比之下,如果封闭 shell 是基线 POSIX,则在单引号字符串中包含文字单引号会变得有点复杂。
bash -c 'dpkg -l | awk '"'"'/linux.+3[.]8[.]0.*44/ { print }'"'"''
此命令按预期工作:
(dpkg -l | egrep "linux.+3.8.0.*44" | awk '{print }')
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 }')"
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
我不知道为什么。就好像水管要断了一样。
因为你在双引号中,</code> 被 shell 扩展,而不是直接传递给 <code>awk
。而 awk 中的 print
默认打印 [=17=]
,即。整行输入,所以如果它扩展为一个空值,那就是你的问题。
bash -c "(dpkg -l | egrep 'linux.+3.8.0.*44' | awk '{print $2}')"
顺便说一句——没有必要分别使用 grep
和 awk
。
bash -c "dpkg -l | awk '/linux.+3.8.0.*44/ { print $2 }'"
如果封闭 shell 本身就是 bash,那么可以使用 $''
作为提供文字字符串的另一种方式:
# $'' only works with bash, ksh, etc., but won't interpret , and lets
# you pass literal quotes
bash -c $'dpkg -l | awk \'/linux.+3[.]8[.]0.*44/ { print }\''
相比之下,如果封闭 shell 是基线 POSIX,则在单引号字符串中包含文字单引号会变得有点复杂。
bash -c 'dpkg -l | awk '"'"'/linux.+3[.]8[.]0.*44/ { print }'"'"''