linux - 如何让 bash 变量在 awk 管道上工作

标签 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]}'`

为该变量执行命令后,下一个等式为真!

...
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/

相关文章:

linux - GCC 使用 GTK+3 时遇到内存不足问题

linux - Shell脚本获取正确的PID

bash - 是否可以获得 gprof 结果的图形表示?

mysql - 如何构建在计算中引用选择结果的 MySQL 查询?

shell - -z 选项在 shell 脚本中的 if 条件中

macos - 使用 sips 将 PDF 转换为图像

linux - 如何将默认值传递给 shell 脚本中的变量?

linux - 在 Linux 内核模块中使用 RPC

c - 在 Linux + Intel 驱动程序上启用合成时,OpenGL 应用程序会产生奇怪的效果

linux - Shell脚本获得 super 用户权限而不以sudo身份运行