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

Ted*_*345 7 awk getline

我有一个理论问题:

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

awk 'BEGIN{var="ls"; var | getline var; system("echo $var")}'
Run Code Online (Sandbox Code Playgroud)

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

awk 'BEGIN{var="system("ls")"; print '$var'}'
Run Code Online (Sandbox Code Playgroud)

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

awk 'BEGIN{system(var="ls"); print "'"$var"'"}'
Run Code Online (Sandbox Code Playgroud)

感谢您的信息.

编辑:

torek:谢谢你的回复.

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

awk 'BEGIN { while ("ls -l" | getline var) system("echo " var  );}'
Run Code Online (Sandbox Code Playgroud)

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

awk 'BEGIN {var="ls -l"; system(var); print var}'
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 15

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

system("echo " var);  # see side note below
Run Code Online (Sandbox Code Playgroud)

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

如果要读取所有输出,则ls需要循环结果getline:

awk 'BEGIN { while ("ls" | getline var) print "I got: " var; }'
Run Code Online (Sandbox Code Playgroud)

由于这只定义了一个BEGIN动作,因此awk将启动,运行ls,收集每个输出行并打印它,然后退出.


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

您可以检查"坏"字符和对象,或引用它们.现代8位干净的壳应该只需要引用引号本身(句法有效性), ,$,<,>,|`.如果使用单引号引用参数(使它们显示为单个"单词"),则只需要转义单引号.有关更多详细信息,请参阅此unix.stackexchange.com答案.


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