我无法从我的 bash 脚本中获取变量来处理 awk 管道。
SERVER_PORT="27018"
...
HOLDER=`netstat -tlpn | awk -v sp=$SERVER_PORT '/:sp */ {split($NF,a,"/"); print a[1]}'`
为该变量执行命令后,下一个等式为真!
...
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 不会在正则表达式常量内部 扩展变量,因此 /:sp */
匹配那些文字字符。
除了正则表达式常量之外,还有其他可能的模式。甚至静态字符串也可以是模式(它们总是正确的,但它们有效)。
~
是awk中的正则表达式匹配操作符。您可以使用它来手动执行与正则表达式常量模式相同的匹配。 ~
接受两个字符串参数。
将其放在一起,我们可以将整行 ($0
) 与 的字符串常量正则表达式(而不是正则表达式常量)进行匹配(
(字符串 ~
)":"sp"*"":"
、我们的变量 sp
和字符串 "*"
)。
当放在一起时,您(正如我上面所写的)$0 ~ ":"sp"*"
作为模式而不是正则表达式常量。
关于linux - 如何让 bash 变量在 awk 管道上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25939838/