gpt4 book ai didi

shell - 在 AWK 命令中将变量传递给 NR 不起作用

转载 作者:行者123 更新时间:2023-12-01 22:40:43 26 4
gpt4 key购买 nike

嗨,我正在尝试使用 awk 命令找到正则表达式后打印 5 行。我有以下内容:

line_start=$(awk '/regex/{print NR}' file)
let line_end=$line_start+4
awk 'NR==$line_start, NR==$line_end' file

这不会打印任何内容。它不会挂起,只是转到下一行。

我研究了一些类似的问题,并看到人们使用 -v 选项。我应该在这里使用它吗,他们的情况是针对更大的 awk 脚本。

顺便说一句,我正在使用 Kornshell

谢谢!

最佳答案

您的脚本存在几个问题。直接的问题是,在第二次调用 awk 时,您在脚本周围使用单引号,因此 $line_start$line_end 不是变量由 shell 扩展,而是将它们作为脚本的一部分逐字传递给 awk。您可以使用双引号来解决此问题。

awk "NR==$line_start, NR==$line_end" file

这只有效,因为 $line_start$line_end 是数字。如果它们是字符串,则无法执行此操作,因为 shell 变量的值最终会被 awk 解析为 awk 代码的一部分,而不是字符串。一般来说,要将字符串传递给 awk 脚本,您可以使用 -v 习惯用法来定义与 shell 变量同名的 awk 变量(如果您愿意,也可以使用不同的名称):

awk -v "line_start=$line_start" -v "line_end=$line_end" 'NR==line_start, NR==line_end' file

您的脚本还有更多问题。

  • 您解析该文件两次。如果文件很大,这可能会很慢,并且如果数据来自管道而不是磁盘文件,则不可能。
  • 如果 /regex/ 存在多个匹配项,则 $line_start 将包含行号列表。 shell 会提示 let 行上存在语法错误。

如果您想在匹配后显示 5 行,请在 awk 中进行计数。

awk '
/regex/ { show_lines = 5 }
show_lines { print; --show_lines; }
' file

如果您只想显示第一个匹配 block ,请在 show_lines 达到 0 后退出。

  show_lines { print; --show_lines; if (!show_lines) exit; }

关于shell - 在 AWK 命令中将变量传递给 NR 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12218609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com