如何获得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

我不太明白你在“匹配字符串:'$ 0〜”:“sp”*“'”下的意思。你能为我解释吗? – 2014-09-19 18:07:52

+0

@АртёмDoe编辑。希望澄清事情。 – 2014-09-19 18:15:17

+2

@Артём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