输入命令后,从命令行读取awk中的变量

时间:2012-10-16 06:38:57

标签: awk

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

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

awk -f myAwk.awk file.txt

我该如何管理它:

awk -f myAwk.awk file.txt nameToSearch

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

3 个答案:

答案 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脚本来询问如何做到这一点,这就是我所展示的内容。