【发布时间】:2012-07-14 06:20:28
【问题描述】:
我发现了几个关于如何将变量从bash 传递到awk 的问题,最值得注意的是-v 命令,但我似乎无法让它们做我想做的事情。
在脚本之外,我正在运行的命令是
awk '$2 ~ /^\/var$/ { print $1 }' /etc/fstab
在/etc/fstab 中搜索/var 分区,并且应该打印出物理挂载点,或者如果没有,则什么都没有。
现在在脚本中我有一个包含许多分区的数组,我想做的是遍历该数组以搜索 fstab 中的每个物理挂载点。问题在于数组中的元素有一个/。
所以我想要做的(在非常不正确的 awk 中)是:
PARTITIONS=(/usr /home /var tmp);
for ((n=0; n<${#PARTITION[@]}; n++)); do
cat /etc/fstab | awk '$2 ~ /^\${PARTITIONS[$n]}$/ { print $1 }';
done
但我知道那是不正确的。我现在最接近的是:
PARTITIONS=(/usr /home /var tmp);
for ((n=0; n<${#PARTITION[@]}; n++)); do
cat /etc/fstab | awk -v partition="${PARTITIONS[$n]}" '$2 ~ /^\/var$/ { print $1," ",partition }';
done
至少将分区变量放入 awk,但对匹配它完全没有帮助。
所以基本上,我需要输入阵列,然后取出物理分区。最终结果将被分配给另一个数组,但是一旦我得到输出,我就可以从那里开始。
我也知道 awk 可以在一开始就消除对 cat 的需求,但我对 awk 的了解还不够,无法做到这一点。 :)
感谢您的帮助。
编辑
cat /etc/fstab | awk -v partition="${PARTITIONS[$n]}" '$2 ~ partition { print $1 }'
大概是我需要的足够有用的东西。我显然过于关注包含正则表达式。如果其他人可以清理它,将不胜感激:)
【问题讨论】:
-
附带说明,我也尝试在正则表达式中使用 ENVIRON[${PARTITIONS[$n]}],但这让 awk 非常不高兴。
-
你不能通过环境传递数组。您可以传递标量变量,但它们需要在 shell(脚本)中导出。在 AWK 中访问变量的语法是
ENVIRON["varname"](没有大括号或美元符号)。 -
@DennisWilliamson 你有这方面的参考吗?
标签: regex arrays bash variables awk