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