簡體   English   中英

awk無法在bash -c中運行“ somecommand | awk'{print $ 2}''”

[英]awk not working in bash -c “somecommand | awk '{print $2}'”

此命令按預期工作:

(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 }'"

如果封閉的外殼本身是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 }\''

相比之下,如果封閉的外殼是基線POSIX,則在單引號字符串中包含文字單引號會變得更加復雜。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM