我有一个理论问题:
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}'
答案 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语言。几十年前的旧习惯。