无法将shell变量传递到AWK并使脚本运行到完成

无法将shell变量传递到AWK并使脚本运行到完成,awk,Awk,我试图将命令行参数传递到awk脚本中,但一旦这样做,命令行就会失去响应,我必须终止程序 var1=$3 var2=$4 awk -v x="$var1" -f awk_script 我知道awk脚本可以看到这个变量,因为它是由它打印的,但是它挂起了,不允许我输入下一个命令。我看到过类似的帖子说这是如何完成的,但我知道问题在于这些行,因为排除这三行可以让脚本运行到完成。有什么想法吗?您的脚本没有挂起-它正在等待输入 要证明这一点,请在启动后在控制台中键入一些字符 您忘记提供要处理的文件的文件名。

我试图将命令行参数传递到awk脚本中,但一旦这样做,命令行就会失去响应,我必须终止程序

var1=$3
var2=$4
awk -v x="$var1" -f awk_script

我知道awk脚本可以看到这个变量,因为它是由它打印的,但是它挂起了,不允许我输入下一个命令。我看到过类似的帖子说这是如何完成的,但我知道问题在于这些行,因为排除这三行可以让脚本运行到完成。有什么想法吗?

您的脚本没有挂起-它正在等待输入

要证明这一点,请在启动后在控制台中键入一些字符

您忘记提供要处理的文件的文件名。例如,如果要处理的文件名为文件到进程:

或者,您可以将内容通过管道传输到脚本的stdin中。例如:

var1=$3
var2=$4
awk -v x="$var1" -f awk_script <FILE_TO_PROCESS
我试图找到一些关于这方面的参考资料,但我找不到。摘自以下手册:

Gawk按以下顺序执行AWK程序。首先,执行通过-v选项指定的所有变量赋值。接下来,gawk将程序编译成内部形式。然后,gawk执行BEGIN块(如果有)中的代码,然后继续读取ARGV数组中命名的每个文件。如果命令行上没有命名的文件,gawk将读取标准输入

对于输入中的每条记录,gawk测试它是否匹配AWK程序中的任何模式。对于记录匹配的每个模式,执行关联的操作。模式按照它们在程序中出现的顺序进行测试

var1=$3
var2=$4
awk -v x="$var1" -f awk_script
最后,在耗尽所有输入后,gawk将执行结束块(如果有)中的代码

IMHO,这并不是说没有模式会跳过输入的处理,尽管这对我来说是有意义的


通过谷歌搜索这个话题,我找到了其他的例子。似乎即使是没有模式的默认操作也会强制处理输入以及getline的出现,即使它在BEGIN规则中。

发布一个完整但小/小的示例,其中包含小样本输入、该输入的预期输出以及awk_脚本中的代码。在这里发布更多Qs之前,请阅读、、和。祝你好运。你知道我是否可以简单地将这些值导入我的awk脚本,然后在同一个bash脚本中运行该awk脚本吗?我不确定我是否理解你的问题。请考虑一下,那是1。awk脚本可以作为命令行参数2提供。命令行上提供的脚本可能包含常量文本以及在awk中执行脚本之前解析的bash变量。因此,在bash脚本中,可以使用bash变量构建部分awk脚本。bash脚本包括bash命令提示符上的直接输入;echo Hello World | awk/$VAR/{print\Pattern found\}prints Pattern found。解析变量后,bash实际使用以下脚本调用awk:/Hello/{print Pattern found}。您可以使用set-x使其可见,它支持bash调试。好的,谢谢,我想我已经解决了。我欣赏你的彻底
var1=$3
var2=$4
cat <FILE_TO_PROCESS | awk -v x="$var1" -f awk_script
$ cat >no-scan.awk <<'EOF'
> BEGIN { print "x: "x }
> EOF

$ awk -v x="Hello" -f no-scan.awk
x: Hello

$
$ cat >scan.awk <<'EOF'
> BEGIN { print "x: "x }
> $0 { print NR": "$0 }
> EOF

$ awk -v x="Hello" -f scan.awk
x: Hello
Some input typed with keyboard
1: Some input typed with keyboard
more
2: more
more
3: more

$
$ awk --version
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5-p2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2016 Free Software Foundation.