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