我有一个理论问题:
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"'"}'
感谢您的信息。
编辑:
托雷克 : 谢谢您的答复。
我知道在第一个例子中,你可以这样做:
awk 'BEGIN { while ("ls -l" | getline var) system("echo " var );}'
对于这个应用程序,你不能从 system() 中分配一个变量输出吗?如本例所示:
awk 'BEGIN {var="ls -l"; system(var); print var}'
最佳答案
我想,你的看法是错误的。 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
中的一些其他情况——任何运行命令的东西)。反引号,$(command)
, 和分号都可以让用户调用任意命令。例如,在 system("echo " var)
上面的例子,如果 var
包含 ; rm -rf $HOME
命令变成 echo ; rm -rf $HOME
,这几乎肯定不是您想要发生的事情。您可以检查“坏”字符和对象,或引用它们。现代 8-bit-clean shell 应该只需要引用引号本身(为了语法有效性),
$
, <
, >
, |
, 和 `
.如果使用单引号引用参数(使它们显示为单个“单词”),则只需转义单引号。见 this unix.stackexchange.com answer更多细节。另一边注:我倾向于在我的 awk 脚本中添加“不必要的”分号,使它们在语法上看起来更像 C。几十年前的老习惯。
关于AWK - 使用 getline 将变量传输到系统 ()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10008407/