【问题标题】:awk save command ouput to variableawk 将命令输出保存到变量
【发布时间】:2010-12-24 06:51:46
【问题描述】:

我需要在某个文件的每一行执行一个命令。例如:

file1.txt 100 4
file2.txt 19 8

所以我的awk 脚本需要执行类似

command $1 $2 $3

并保存command $1 $2 $3 的输出,这样system() 将不起作用,getline 也不起作用。 (如果我这样做,我无法通过管道输出。)

这个问题的限制是只能使用awk。 (我已经有了 bashscriot + awk 的解决方案……但我只想要 awk……只是想了解更多)

【问题讨论】:

    标签: linux scripting awk


    【解决方案1】:

    使用getline有什么问题?

    $ ./test.awk test.txt # ls -F | grep 测试 测试.awk* 测试.txt # 猫测试.txt |荷兰语 1 ls -F | grep 测试 2 猫测试.txt |荷兰语 3 猫测试.awk # 猫测试.awk #!/usr/bin/awk -f { cmd[NR] = $0 while ($0 | getline line) output[NR] = output[NR] line RS } 结尾 { for (i in cmd) print "#" cmd[i] ORS output[i] }

    【讨论】:

    • 这是 bash 脚本。当我使用 getline 时,我无法通过管道传输命令,例如 cat file |过程参数,我只获取cat文件。我这样做是为了更干净的方式来完成这项任务......
    • 最后 10 行回答了我的问题
    • 嗯,我认为这显然是脚本在自身运行的演示,但也许不是。
    【解决方案2】:

    Awk 的 system() 函数将字符串传递给 /bin/sh,因此您可以根据需要使用重定向运算符,例如 ">file.out"。

    awk '{system("command " $1 " " $2 " " $3 ">" $1 ".out");}'
    

    编辑:好的,通过保存,您的意思是进入 awk 变量。 ehemient 是在正确的轨道上,那么。这就是 awk 的 getline 所做的,例如 shell/perl 中的反引号或 $(cmd)。事实上,google for awk backticks 发现了这个: http://www.omnigroup.com/mailman/archive/macosx-admin/2006-May/054665.html

    你说你不能使用 getline 因为你不能管道。但是您可以使用 tee 和文件描述符技巧来解决这个问题。如果 /bin/sh 是 bash,则此方法有效:

    { "set +o posix; command " $1 " " $2 " "  $3  " | tee >(grep foo)"  | getline var; print toupper(var); } # bash-only, and broken.
    

    set +o posix 是必要的,因为 awk 以sh 运行 bash,这使它在读取其启动文件后进入 posix 模式。嗯,我没有任何运气让它工作,而且无论如何它都需要 bash。

    好的,这可行:

    
        $ touch foo bar
        $ echo "foo bar" | 
          awk '{ "{ ls " $1 " " $2 " "  $3  " | tee /dev/fd/10 | grep foo > /dev/tty; } 10>&1"  | getline var; print toupper(var); }'
        foo
        BAR
    

    【讨论】:

    • 我的实际解决方案是这样做,但我无法将命令的输出发送到变量
    • 您可以使用随后的readline [...] < $1 ".out" 循环将输出重新插入。不要忘记清理自己......
    • 我同时使用了一些文件描述符重定向来管道和 getline。这能满足你的需要吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多