我无法从我的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
答案 0 :(得分:7)
在正则表达式中,常量awk不会扩展变量。因此,/:sp */
字面上是/:sp */
。
您需要将该匹配项设为字符串:$0 ~ ":"sp" *"
awk脚本由pattern {action}
对组成。 /:27018 */
是一种模式(使用正则表达式常量)。正如我在开头所说,awk并没有扩展里面的正则表达式,因此/:sp */
匹配那些文字字符。
除了正则表达式常量之外,还有其他模式可能。即使是静态字符串也可以是模式(它们总是正确但它们可以工作)。
~
是awk中的正则表达式匹配运算符。您可以使用它来手动执行与正则表达式常量模式相同的匹配类型。 ~
需要两个字符串参数。
将它们放在一起我们可以将整行(~
)与$0
的字符串常量正则表达式(而不是正则表达式常量)匹配(":"sp" *"
)(字符串{{ 1}},我们的变量":"
和字符串sp
)。
当放在一起时,会将你(如上所述)" *"
作为模式而不是正则表达式常量。