访问 ksh 中 nawk 内的外壳变量

发布于 2024-11-16 20:20:22 字数 630 浏览 1 评论 0原文

我正在尝试访问管道 nawk 内的 shell 变量。 我以前从未这样做过,想知道是否可能。

以下是命令 sbdadm list-lu 内容:

找到 2 个逻辑单元

 GUID 数据大小源
<小时>

600144f029bf0a0000004e0484740052 107380964864 /dev/rdsk/c9d0s1 600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

这是我的脚本示例:

DISK=/dev/rdsk/c9d0s3
sbdadm list-lu |nawk '/$DISK/ {print}'

注意:我知道“ /$DISK/”语法将不起作用,因为 $ 是正则表达式符号。 如果这样的代码可能的话,我需要正确的语法。

另外,awk 会生成另一个 shell 吗? 如果是这样,我是否可以将此变量 $DISK 导出到该 shell。

I am trying to access a shell variable inside a piped nawk.
I have never done this before and was wondering if its possible.

Here is the command sbdadm list-lu contents:

Found 2 LU(s)

          GUID                    DATA SIZE           SOURCE

600144f029bf0a0000004e0484740052
107380964864 /dev/rdsk/c9d0s1
600144f029bf0a0000004e0484740053
53694562304 /dev/rdsk/c9d0s3

Here is my sample of my script :

DISK=/dev/rdsk/c9d0s3
sbdadm list-lu |nawk '/$DISK/ {print}'

NOTE: I know the " /$DISK/" syntax will not work since $ is part of a regex symbol.
I need the right syntax if such a code is ever possible.

In addition,does awk spawn another shell?
If so, is it possible that I can export this variable $DISK to that shell.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

嘴硬脾气大 2024-11-23 20:20:22

问题不在于 $ 是 RE 语法的一部分;而是在于 $ 是 RE 语法的一部分。 / 是 RE 分隔符。如果您只是在寻找 c9d0s3,那么使用正确的引用就可以解决问题:

$ DISK=c9d0s3
$ awk "/$DISK/ {print}" output
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

说明:如果您使用 "" 而不是 '' ,那么 shell 变量将在将程序交给 awk 之前展开,因此 awk 将被视为

/c9d0s3/ {print}

其程序。您仍然可以搜索其中包含 / 的模式,但这需要一些 shell 引用魔法:

$ DISK=/dev/rdsk/c9d0s3
$ awk "{if (match(\$0, \"$DISK\")) print}" output
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

并且 awk 不会生成子 shell。为什么会这样?如果您可以通过环境来传递变量,为什么还需要一个变量呢?

The problem is not that $ is part of RE syntax; it's that / is the RE delimiter. If you were just looking for c9d0s3, then using the proper quoting would do the trick:

$ DISK=c9d0s3
$ awk "/$DISK/ {print}" output
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

Explanation: if you use "" instead of '', then the shell variable would be expanded before handing the program to awk, so awk would see

/c9d0s3/ {print}

as its program. You can still search for a pattern with / in it, but it takes some shell quoting magic:

$ DISK=/dev/rdsk/c9d0s3
$ awk "{if (match(\$0, \"$DISK\")) print}" output
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

And no, awk does not spawn a subshell. Why would it? And why would you need one to pass a variable if you can just do it through the environment?

逐鹿 2024-11-23 20:20:22
export DISK=/dev/rdsk/c9d0s3
cat output | awk '$0 ~ ENVIRON["DISK"]{print}'

结果:

600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

使用 system 调用(导出 DISK 后):

echo | awk '{system("echo $DISK")}'

结果:

/dev/rdsk/c9d0s3

export DISK=/dev/rdsk/c9d0s3
cat output | awk '$0 ~ ENVIRON["DISK"]{print}'

results:

600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

With system call (after DISK was exported):

echo | awk '{system("echo $DISK")}'

results:

/dev/rdsk/c9d0s3

浅浅 2024-11-23 20:20:22

除了 jwr 的答案,您还可以使用 shell 变量的值显式设置 awk 变量:

 nawk -v disk="$DISK" '$3 == disk' output_file

In addition to j.w.r's answer, you can explicitly set an awk variable with the value of the shell variable:

 nawk -v disk="$DISK" '$3 == disk' output_file
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文