想从tcl执行awk

mil*_*epa 1 awk tcl

我想在tcl中执行以下行:

exec awk -F"[][]" '/dB/ { print $2 }' <(amixer sget Master)

但错误:missing close-brace出现.

然后我换了这个:

exec awk -F"[][]" {/dB/ { print $2 }} <(amixer sget Master)

用大括号更改单引号.现在的错误是:

无法读取文件 "(amixer": no such file or directory

然后我改为:

exec awk -F{[][]} {/dB/ { print $2 }} <(amixer sget Master)

仍然与后者相同的错误.

我真的很挣与exec命令的tcl解析机制.请帮忙.谢谢.

amixer sget主输出:

  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback 0 - 64
  Mono: Playback 39 [61%] [-25.00dB] [on]
Run Code Online (Sandbox Code Playgroud)

Don*_*ows 6

shell和Tcl具有完全不同的语法,这是一个重要的领域.shell调用的正确音译:

awk -F"[][]" '/dB/ { print $2 }' <(amixer sget Master)
Run Code Online (Sandbox Code Playgroud)

这是:

exec amixer sget Master | awk {-F[][]} {/dB/ { print $2 }}
Run Code Online (Sandbox Code Playgroud)

在partixular中,Tcl和shell对如何引用事物以及需要引用的内容有不同的看法.而且,awk从stdin中获取输入更容易,而不是试图使Tcl句柄管道完全按照shell的方式进行重定向(你可以做到,但它很难,真的不值得打扰对于这个简单的事情).

当然,您可以改为使用Tcl进行解析,因为它具有合理的正则表达式匹配支持.例如,这会将分贝级别存储在变量中decibels:

set mixer "Master"
regexp {\[([\d.]+)dB\]} [exec amixer sget $mixer] -> decibels
Run Code Online (Sandbox Code Playgroud)