如何让bash变量在awk管道上运行

时间:2014-09-19 18:01:23

标签: linux bash shell unix 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
...

如果我跑

netstat -tlpn | awk '/:27018 */ {split($NF,a,"/"); print a[1]}'
在我的shell窗口上的一切都很好,它给了我进程的PID。

所以我的问题是:如何正确地将变量传递给awk或者某些东西已经坏了? 运行CentOS 7

1 个答案:

答案 0 :(得分:7)

在正则表达式中,常量awk不会扩展变量。因此,/:sp */字面上是/:sp */

您需要将该匹配项设为字符串:$0 ~ ":"sp" *"

awk脚本由pattern {action}对组成。 /:27018 */是一种模式(使用正则表达式常量)。正如我在开头所说,awk并没有扩展里面的正则表达式,因此/:sp */匹配那些文字字符。

除了正则表达式常量之外,还有其他模式可能。即使是静态字符串也可以是模式(它们总是正确但它们可以工作)。

~是awk中的正则表达式匹配运算符。您可以使用它来手动执行与正则表达式常量模式相同的匹配类型。 ~需要两个字符串参数。

将它们放在一起我们可以将整行(~)与$0的字符串常量正则表达式(而不是正则表达式常量)匹配(":"sp" *")(字符串{{ 1}},我们的变量":"和字符串sp)。

当放在一起时,会将你(如上所述)" *"作为模式而不是正则表达式常量。