如何获得bash变量在awk管道上的工作
问题描述:
我无法从我的bash脚本中获取变量以在awk管道上工作。如何获得bash变量在awk管道上的工作
SERVER_PORT="27018"
...
HOLDER=`netstat -tlpn | awk -v sp=$SERVER_PORT '/:sp */ {split($NF,a,"/"); print a[1]}'`
执行该变量的命令后,下一个等式为TRUE!
...
if [ "$HOLDER" == "" ]; then
...
如果我将shell窗口上运行
netstat -tlpn | awk '/:27018 */ {split($NF,a,"/"); print a[1]}'
一切都很好,这让我的进程的PID。
所以我的问题是:如何正确地将变量传递给awk或者有什么坏的? 运行CentOS 7
答
在正则表达式常量awk中不扩展变量。所以/:sp */
实际上是/:sp */
。
你需要让那场比赛的字符串:$0 ~ ":"sp" *"
的awk脚本是由的pattern {action}
双。 /:27018 */
是一种模式(使用正则表达式常量)。正如我在开始时所说awk不扩展变量里面一个正则表达式常量,所以/:sp */
是匹配那些文字字符。
除了正则表达式常量之外,还有其他可能的模式。即使静态字符串也可以是模式(它们总是正确的,但它们工作)。
~
是awk中的正则表达式匹配运算符。您可以使用它来手动执行与正则表达式常量模式相同的匹配类型。 ~
需要两个字符串参数。
把我们一起可以匹配(~
)的":"sp" *"
对字符串常量,正则表达式的整条生产线($0
)(而不是一个正则表达式常数)(字符串":"
,我们的变量sp
和字符串" *"
)。
其中,当放在一起,让你(如我上面写的)$0 ~ ":"sp" *"
作为模式,而不是正则表达式常量。
我不太明白你在“匹配字符串:'$ 0〜”:“sp”*“'”下的意思。你能为我解释吗? – 2014-09-19 18:07:52
@АртёмDoe编辑。希望澄清事情。 – 2014-09-19 18:15:17
@АртёмDoe请阅读http://www.gnu.org/software/gawk/manual/gawk.html#Regexp,并特别注意'字符串常量'和'regexp常量'之间的区别以及“使用动态正则表达式'。另外,如果您打算进行更多的awk编程,请阅读Arnold Robbins编写的书“Effective Awk Programming,Third Edition”。 – 2014-09-19 18:17:51