【问题标题】:reading a variable in awk from the command line after entering the command输入命令后从命令行读取 awk 中的变量
【发布时间】:2012-10-06 04:59:13
【问题描述】:

我尝试使用 awk 搜索文件。如何让 awk 从命令行读取变量作为名称以在文件中进行搜索:

这是我用来搜索文件的常规方式,我可以要求用户在 file.txt 中输入要搜索的名称

awk -f myAwk.awk file.txt

我该如何管理它:

awk -f myAwk.awk file.txt nameToSearch

如何使用 ARGC 和 ARGV 搜索 file.txt 中的 nameToSearch?

【问题讨论】:

  • 你也可以在你的 awk 中搜索字符串..

标签: awk


【解决方案1】:

你可能正在寻找的是

awk [-W option] [-F value] [-v var=value] [--] 'program text' [file ...]

所以

awk -v MYVAR=nameToSearch -v OTHERVAR=somethingElse -f myAwk.awk file.txt

是这样吗?当然开关的顺序( -f, -v )并不重要。显然,您需要在 awk 程序本身中包含 MYVAR ( OTHERVAR ) 作为变量标识符。

【讨论】:

  • 请注意,-v 不是必需的。 awk -f myAwk.awk MYVAR=nameToSearch file.txt 也可以。
  • @WilliamPursell,你是对的,但如果有人使用该方法,那么请注意,MYVAR=... 必须位于 awk 程序文本或 -f myAwk.awk 之后。此外,在某些极端情况下,-v MYVAR=... 的表现会更好,并且 awk 指南通常建议使用此方法而不是您描述的旧方法。
【解决方案2】:

要将变量传递给 awk,您可以使用 -v 命令。 例如:

cat file.txt | awk -v p="stringToSearch" '$0 ~ p'

在此命令中,将 stringToSearch 替换为模式(请保留双引号,它们对于保留空格很有用)。 awk 命令$0 ~ p 将当前行与给定模式进行比较。

另一种方法是从 shell 构建 awk 命令:

p="stringToSearch"
awk "/$p/" file.txt

您必须在命令中使用双引号来强制扩展$p

【讨论】:

  • 永远不要做上面的第二件事,因为它会根据 shell 变量的值产生非常神秘的结果,并对脚本的其余部分引入可怕的转义要求。
  • 如果你知道你给 p 的值是多少,应该不会出错。当然,如果你从非受控源读取 p,或者让外部脚​​本控制它的值,你可能会得到意想不到的结果。就像任何代码一样。
  • 即使你知道你的变量有什么值,它也会引入转义引号、反斜杠等的需要。如果你打算使用这种类型的跳转回壳方法,更好的语法会是 awk '/'"$p"'/' 以避免转义问题,但最终它只是从来没有必要和一个坏习惯进入,当它确实失败时,它会产生非常神秘的失败和/或错误消息。只需使用您在第一个示例中显示的 -v var=value 即可,以后不会有任何意外。
  • 哦,请注意第一个示例正在做的是在 RE 上下文中使用字符串,这需要转义“p”中的任何 RE 元字符和反斜杠。如果您真的只想检查输入记录中是否存在字符串(而不是匹配 RE 的输入记录),那么您应该使用“index($0,p)”而不是“$0 ~ p”。
【解决方案3】:

如果允许更改参数的顺序,那么我们可以这样做:

awk -f myAwk.awk nameToSearch file.txt

那么你可以这样做:

awk 'NR==1 { nameToSearch = $0; next} { ... rest of myAwk.awk here ...}' nameToSearch file.txt

您当然可以将NR==1 {...} 块添加到myAwk.awk 文件的开头,然后继续使用:

awk -f myAwk.awk nameToSearch file.txt

Piotr Wadas 描述的技术具有相同的效果:

awk -v nameToSearch=whatever -f myAwk.awk file.txt

这就是我自己使用的,而不是将whatever 作为附加参数传递给脚本。将whatever 作为附加参数传递是脚本编写者在将-v 设施添加到awk 之前必须做的事情。如果写 -v nameToSearch= 太冗长,那么我会将整个内容封装在一个 shell 脚本中,然后说:

myShellScript whatever file.txt

但是你问如何通过将whatever 作为附加参数传递给 awk 脚本来做到这一点,所以这就是我演示的内容。

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2012-05-29
    相关资源
    最近更新 更多