AWK - 使用getline将变量传输到system()?

时间:2012-04-04 09:27:24

标签: awk getline

我有一个理论问题:

1)如何将变量传递给getline()系统?

awk 'BEGIN{var="ls"; var | getline var; system("echo $var")}'

2)如何为输出系统(“ls”)分配变量并在awk中打​​印结果?

awk 'BEGIN{var="system("ls")"; print '$var'}'

3)你能在系统中分配一个变量(var =“ls”)并将结果打印成awk吗?

awk 'BEGIN{system(var="ls"); print "'"$var"'"}'

感谢您提供的信息。

编辑:

torek :感谢您的回复。

我理解在第一个例子中,你可以这样做:

awk 'BEGIN { while ("ls -l" | getline var) system("echo " var  );}'

对于此应用程序,您不能从system()分配变量输出?如下例所示:

awk 'BEGIN {var="ls -l"; system(var); print var}'

1 个答案:

答案 0 :(得分:15)

我认为你正在以错误的方式看待这个问题。 Awk的system只接受任何旧字符串,所以给它一个,例如:

system("echo " var);  # see side note below

(请记住,在awk中,字符串由邻接连接)。而且,system只运行一个命令;要捕获其输出,您需要使用getline,类似于您的问题#1。

如果您想阅读ls的所有输出,则需要循环显示getline的结果:

awk 'BEGIN { while ("ls" | getline var) print "I got: " var; }'

由于此操作仅定义BEGIN操作,awk将启动,运行ls,收集每个输出行并打印,然后退出。


旁注:对传递给shell的变量要非常小心(这包括对system的调用和| getline左侧的项目,以及现代awk中的其他一些情况。 1}} - 运行命令的任何东西)。反引号,$(command)和分号都可以允许用户调用任意命令。例如,在上面的system("echo " var)示例中,如果var包含; rm -rf $HOME,则命令变为echo ; rm -rf $HOME,这几乎肯定不是您想要发生的事情。

您可以检查“错误”字符和对象,或引用它们。现代的8位清理shell应该只需要引用引号(用于语法有效性),$<>|`。如果使用单引号引用参数(使它们显示为单个“单词”),则只需要转义单引号。有关详细信息,请参阅this unix.stackexchange.com answer


另一个注意事项:我倾向于在我的awk脚本中添加“不必要的”分号,使它们在语法上看起来更像C语言。几十年前的旧习惯。