我尝试使用 awk 搜索文件。如何让 awk 从命令行读取变量作为名称以在文件中进行搜索:
这是我用来搜索文件的常规方式,我可以要求用户输入要在 file.txt 中搜索的名称
awk -f myAwk.awk file.txt
我该如何管理它:
awk -f myAwk.awk file.txt nameToSearch
如何使用 ARGC 和 ARGV 在 file.txt 中搜索 nameToSearch?
我尝试使用 awk 搜索文件。如何让 awk 从命令行读取变量作为名称以在文件中进行搜索:
这是我用来搜索文件的常规方式,我可以要求用户输入要在 file.txt 中搜索的名称
awk -f myAwk.awk file.txt
我该如何管理它:
awk -f myAwk.awk file.txt nameToSearch
如何使用 ARGC 和 ARGV 在 file.txt 中搜索 nameToSearch?
您可能正在寻找的是
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 ) 作为变量标识符。
要将变量传递给 awk,可以使用-v
命令。例如:
cat file.txt | awk -v p="stringToSearch" '$0 ~ p'
在此命令中,将 stringToSearch 替换为模式(请保留双引号,它们对于保留空格很有用)。awk 命令$0 ~ p
将当前行与给定模式进行比较。
另一种方法是从 shell 构建 awk 命令:
p="stringToSearch"
awk "/$p/" file.txt
您必须在命令中使用双引号来强制扩展$p
.
如果允许更改参数的顺序,那么我们可以这样做:
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 脚本来做到这一点,所以这就是我所演示的。