【问题标题】:accessing outer shell variables inside nawk in ksh在 ksh 中访问 nawk 内的外壳变量
【发布时间】:2011-09-22 07:02:18
【问题描述】:

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

这里是命令sbdadm list-lu内容:

找到 2 个 LU

          GUID                    DATA SIZE           SOURCE

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。

【问题讨论】:

  • 你知道cat outputUUOC吗?
  • @larsmans : 抱歉打错了.. 已更正
  • echo 不起作用。看我的回答。
  • @larsman:很抱歉造成混乱......基本上我想要 sbdadm list-lu> 输出......对输出是变量而不是文件感到困惑......我已经重新更正这个问题..感谢你们的帮助

标签: shell unix awk ksh nawk


【解决方案1】:

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

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

解释:如果你使用""而不是'',那么在将程序交给awk之前,shell变量会被扩展,所以awk会看到

/c9d0s3/ {print}

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

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

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

【讨论】:

  • 因为单引号对我有用.. 我认为 $DISK 不可见的唯一原因是因为它在另一个 shell 中...感谢澄清
【解决方案2】:
export DISK=/dev/rdsk/c9d0s3
cat output | awk '$0 ~ ENVIRON["DISK"]{print}'

结果:

600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

使用system 调用(磁盘导出后):

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

结果:

/dev/rdsk/c9d0s3

【讨论】:

    【解决方案3】:

    除了j.w.r's answer,还可以显式设置一个awk变量,其值为shell变量的值:

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

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 2013-05-19
      • 2011-06-01
      • 2018-11-09
      • 1970-01-01
      • 2013-07-08
      相关资源
      最近更新 更多