AWK 不接受带有错误 awk 的 TCL 结果:无法打开文件

AWK doesn't accept TCL results with error awk: can't open file

我正在尝试使用以下代码从 AWK 中的 TCL 获取 ping 结果:

set n [exec ping 8.8.8.8 -c 2]
exec awk {"NR>=2 && NR<=4 { print }"} $n

但是我得到这个错误:

Error in startup script: awk: can't open file PING 8.8.8.8 ...

似乎 AWK 得到 $n 不是作为输入而是作为文件。 我找到了 但尽管看起来是同一个问题,但我遇到了不同的问题。我可以 运行 AWK 我的 TCL。问题是它不接受 Input 作为我的来源,虽然我没有我们 -f 切换它仍然作为文件获取它。

想到了 2 个选择

  1. 将 ping 输出作为标准输入移交给 awk:

    set n [exec ping 8.8.8.8 -c 2]
    exec awk {NR>=2 && NR<=4 { print }} << $n
    # ..................................^^
    

    https://tcl.tk/man/tcl8.6/TclCmd/exec.htm

  2. 不用管临时变量

    exec ping 8.8.8.8 -c 2 | awk {NR>=2 && NR<=4 { print }}
    

您不需要大括号内的双引号:大括号用于引用 awk 主体,您不想将双引号传递给 awk。


另一种选择:因为您只需要 ping 输出的第 2 行到第 4 行,所以使用 Tcl 而您根本不需要 awk:

set ping [exec ping 8.8.8.8 -c 2]
set lines [lrange [split $ping \n] 1 3]
puts [join $lines \n]

或不可读

puts [join [lrange [split [exec ping 8.8.8.8 -c 2] \n] 1 3] \n]