0

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

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

awk -f myAwk.awk file.txt

我该如何管理它:

awk -f myAwk.awk file.txt nameToSearch

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

4

3 回答 3

3

您可能正在寻找的是

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 ) 作为变量标识符。

于 2012-10-16T06:42:17.947 回答
1

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

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

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

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

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

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

于 2012-10-16T06:57:31.443 回答
1

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

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 脚本来做到这一点,所以这就是我所演示的。

于 2012-10-16T06:59:23.147 回答