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