【问题标题】:Is it possible to use a variable instead of a file with the gnu awk command?是否可以通过 gnu awk 命令使用变量而不是文件?
【发布时间】:2019-10-20 20:00:36
【问题描述】:

我是 shell 脚本的新手,我正在阅读一个脚本,但我不了解使用 gawk 命令的函数。

  awk_egrep () {
  local pattern_string=$1

  gawk '{
    while ($0) {
      start=match($0, pattern);
      token=substr($0, start, RLENGTH);
      print token;
      $0=substr($0, start+RLENGTH);
    }
  }' pattern="$pattern_string"
}

当我开始阅读 GNU awk 手册时,它写道如果程序很短,最容易 将它包含在运行 awk 的命令中,如下所示: awk 'program' input-file1 input-file2 ...

我的问题:作者何时写作 模式="$pattern_string" 他是在使用变量而不是文件吗? 搜索时我发现要使用变量,我们可以使用这样的管道 回声“$var1”|啊。

【问题讨论】:

  • 是的,awk 的定义是可变的(请参阅这篇文章本身的所有答案)。请务必提及您的完整要求以及输入和预期输出,因为恕我直言,您的脚本肯定会更容易(与当前看起来很复杂的脚本相比)。让我们知道。
  • 如果我不理解您的评论,您需要有关脚本的更多信息。我通过阅读github.com/dominictarr/JSON.sh/blob/master/JSON.sh 下面的脚本来学习 shell 脚本。它用于解析json文件,该函数由函数tokenize()使用
  • 不推荐使用 awk 解析 JSON 这些答案有助于您理解脚本,您可以打开一个新线程,以防您需要使用实际用于解析 JSON 的工具。
  • 最终目的是学习 shell 脚本,我没有任何用 awk 解析 JSON 的意图。谢谢你的帮助。现在对我来说功能更清楚了

标签: shell awk


【解决方案1】:

pattern="$pattern_string" 用来自 bash 的变量 pattern_string 的内容声明 awk 的变量 pattern(这里是 $1)。 awk 从标准输入而不是从文件中读取。

代替

gawk '...' pattern="$pattern_string"

你也可以使用:

gawk -v pattern="$pattern_string" '...'

【讨论】:

  • 嗨赛勒斯先生,对不起,如果我在这里错了,但虽然这是一个变量赋值,但代码是如何读取输入的。当我在我的盒子(Ubuntu aws one)中尝试相同的代码时,它只是在等待输入,如果我在这里遗漏了什么,请告诉我。
  • 我假设函数awk_egrep是这样使用的:echo "foo" | awk_egrep "bar"awkbar 声明变量pattern 并从标准输入读取内容,这里只有字符串foo
  • -v 语法大致相当于在BEGIN 块中声明一个变量,而在BEGIN 之后作为常规参数赋值。这里没关系,但两者并不完全等价。
【解决方案2】:

我敢肯定,你仔细检查你的代码,你会意识到你的代码会调用带有如下参数的函数:

 awk_egrep "some_argument"

现在来回答您为什么要使用pattern="$pattern_string" 的问题,我们实际上可以直接使用:

awk '
...........your awk code.....
' "$pattern_string"

上面的内容应该足以让你的函数工作,你可以看到为什么使用变量,因为函数期望在调用它时传递一个参数,是的,它是awk的变量赋值。

还有一点看起来 OP 没有共享完整的代码,所以 awk 有可能从标准输入而不是 Input_file 读取数据。

【讨论】:

    【解决方案3】:

    来自 awk 手册页:

      If  a  filename on the command line has the form var=val it is treated as a variable assignment.  The variable var will be
       assigned the value val.  (This happens after any BEGIN rule(s) have been run.)  Command line variable assignment  is  most
       useful  for dynamically assigning values to the variables AWK uses to control how input is broken into fields and records.
       It is also useful for controlling state if multiple passes are needed over a single data file.
    

    实际上,这将创建一个 AWK 变量模式,设置为 SHELL 变量“pattern_string”的值(在这种情况下,“awk_egrep”函数的第一个参数。您可以在代码中看到 AWK 脚本正在使用“模式”变量。

    在这种情况下,这相当于 'awk -v "pattern=$pattern_string"

    编辑

    值得注意的是,虽然 -v 将在“BEGIN”块中设置变量,但 var=val 参数将在处理下一个文件参数之前设置变量。这可用于支持多通道或不同的处理阶段。例如

    awk '{ print v, $0 }' v=1 infile v=2 infile
    

    将导致进程 infile 两次,第一次使用 v=1,第二次使用 v=2。

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 2019-03-23
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多