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

标签 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"'"}'

感谢您的信息。

编辑:

托雷克 : 谢谢您的答复。

我知道在第一个例子中,你可以这样做:
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/

相关文章:

c++ - 从文件中查找最后一个字母为 'a' 的单词

Linux脚本按行中的日期时间模式过滤文本文件中的行

c - 在 c 代码中使用 awk 时出错

c++ - getline 不适用于 fstream

c++ - 判断 `cin.getline()`是否成功

C++文本文件转化为多维数组问题

c++ - 无法使用 getline() 输入字符串。它只读取一个字符串

awk 选择带有变量的行,无法打开没有这样的文件

unix - 如何垂直拆分具有 250k 列的文件?

linux - Bash 修剪或 sed 换行