1

我正在尝试访问管道 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到该外壳。

4

3 回答 3

1
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

于 2011-06-24T19:30:14.860 回答
1

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

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

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

/c9d0s3/ {print}

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

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

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

于 2011-06-24T19:43:47.470 回答
1

除了jwr 的 answer之外,您还可以使用 shell 变量的值显式设置一个 awk 变量:

 nawk -v disk="$DISK" '$3 == disk' output_file
于 2011-06-24T19:46:32.290 回答