如何将Awk命令的输出分配给shell变量?

时间:2017-03-01 23:20:07

标签: awk aix

我试图将Awk命令的输出分配给变量但我收到错误。我想在变量中分配和回显结果。

count = `awk '$0 ~ /Reason code "68"/' ladb.log | wc -l`

我已将该声明用反引号括起来,并在下面收到此错误

/lsf9/db/dict/=: Unable to open dictionary: No such file or directory
DataArea =              does not exist

1 个答案:

答案 0 :(得分:0)

您的主要问题是您使用空格。您无法在shell脚本中进行间隔分配。

反引号可能对您的代码有害,但我在很长一段时间内都没有使用IBM AIX,因此它可能对您的Posix shell至关重要(尽管this guide及其覆盖率$(…) vs `…`可能不会在这里提出问题)。你可以尝试的一件事是用ksh或bash运行代码。

以下代码假定符合标准的Posix shell。如果他们无法正常工作,请尝试使用"$(…)"表示法替换"`…`"表示法。有了这些,因为它只是一个返回的数字,你在技术上不需要周围的双引号,但这是一个很好的做法。

count="$(awk '$0 ~ /Reason code "68"/' ladb.log | wc -l)"

以上应该可行,但可以更清晰地写成

count="$(awk '/Reason code "68"/ {L++} END { print L }' ladb.log)"

正如对问题的评论所述,grep -c可能比awk更快,但如果您知道该文本的位置,则awk可能会更快。让我们说它开始了一条线:

count="$(awk '$1$2$3 == "Reasoncode\"68\"" {L++} END { print L }' ladb.log)"

是的,Posix shell能够理解"$(…)"内的双引号与外部双引号无关,因此只需要转义该awk字符串中的内部双引号。