【问题标题】:Bash scripting | awk with ariablesBash 脚本 |带变量的 awk
【发布时间】:2016-01-01 13:56:32
【问题描述】:

作品:

repquota $HOME | awk "{if(\$3 > $MIN && \$3 < $MAX )print}"

但是如果我尝试将它插入到变量中它不起作用:

VARIABLE=`repquota $FULL_HOME | awk "{if(\$3 > $MIN && \$3 < $MAX )print}"`

awk: {if( > 1572864 &&

awk: ^ 语法错误

【问题讨论】:

  • 什么是 FULL_HOME、MAX 和 MIN 是否导出了所有相关变量?
  • 试试export MIN MAXVARIABLE=$(repquota $FULL_HOME | awk "{if(\$3 &gt; $MIN &amp;&amp; \$3 &lt; $MAX )print}")
  • 我很高兴做 \$" 舞蹈比简单地使用 -v 更难。世界上有很多安全漏洞,因为编写不安全的代码通常更容易。 bash/awk 对不安全的编码器不友好:-)。请参阅下面的答案。

标签: bash awk centos


【解决方案1】:

使用新的命令替换语法$(command):

VARIABLE=$(repquota $FULL_HOME | awk "{if(\$3 > $MIN && \$3 < $MAX )print}")

说明

来自man bash

   When  the  old-style  backquote form of substitution is used, backslash
   retains its literal meaning except when followed by $, `,  or  \.   The
   first backquote not preceded by a backslash terminates the command sub‐
   stitution.  When using the $(command) form, all characters between  the
   parentheses make up the command; none are treated specially.

使用反斜杠时,双引号字符串中的\$var 不会转义,导致$var 的值被替换,因此awk 看不到$3,正如您所料。

您可以使用以下命令查看它:

var="I am a test string"
echo `echo "\$var"` # output: I am a test string
echo $(echo "\$var") # output: $var

编辑:作为 Ed Morton cmets,您不应以这种方式从 shell 传递 awk 变量,而应使用 awk 的 -v 开关:

VARIABLE=$(repquota $FULL_HOME | awk -v min="$MIN" -v max="$MAX" '{if($3 > min && $3 < max )print}')

【讨论】:

【解决方案2】:

你的 bash 语法离题了。您没有引用变量、错误地引用 awk 脚本以及使用已弃用的反引号。您似乎想要做的是:

VARIABLE=$(repquota "$FULL_HOME" | awk -v min="$MIN" -v max="$MAX" '($3>min) && ($3<max)')

但由于您没有提供任何示例输入和预期输出,因此这是一个未经测试的猜测,并且总是很难通过阅读一个没有执行您想要的脚本来判断您想要什么。

【讨论】:

  • 我会将 $(...) 设为 "$(...)" 以保证空格安全。使用 -v 和非常奇怪的模式的奖励积分:-)
  • @Gunstick - 谢谢。你确定在这种情况下你需要双引号吗?这是一项任务,因此不会发生通配符和分词。试试x=$(awk 'BEGIN{print "a\tb"}'); echo "$x"
  • 我之前的评论是错误的。不需要引号。如果 awk 检测出多行,然后您想计算行数或基于行数做其他事情,则使用 "$VARIABLE" 时,双引号将保留换行符。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2012-11-15
  • 2013-08-17
相关资源
最近更新 更多