首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >想要从tcl执行awk

想要从tcl执行awk
EN

Stack Overflow用户
提问于 2013-09-06 06:38:25
回答 2查看 4.8K关注 0票数 1

我想在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主输出:

代码语言:javascript
复制
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback 0 - 64
  Mono: Playback 39 [61%] [-25.00dB] [on]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-06 12:31:03

shell和Tcl有非常不同的语法,这是一个重要的领域。shell调用的正确音译:

代码语言:javascript
复制
awk -F"[][]" '/dB/ { print $2 }' <(amixer sget Master)

这是:

代码语言:javascript
复制
exec amixer sget Master | awk {-F[][]} {/dB/ { print $2 }}

在分词中,Tcl和shell对于如何引用事物和需要引用的内容有不同的想法。而且,让awk只从stdin获取它的输入要容易得多,而不是试图让Tcl句柄管道正确地按照shell所做的方式进行重定向(您可以这样做,但这是一项艰苦的工作,不值得为这么简单的事情操心)。

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

代码语言:javascript
复制
set mixer "Master"
regexp {\[([\d.]+)dB\]} [exec amixer sget $mixer] -> decibels
票数 6
EN

Stack Overflow用户

发布于 2013-09-06 08:10:54

Thx到Donal Felows,我发现问题是,不是,shell,引用,而是,tcl语法。因此,我修改了整个答覆,建议如下:

代码语言:javascript
复制
exec /bin/bash -c {amixer sget Master | awk -F"[][]" '/dB/{print $2}'}

或者,如果您喜欢使用进程替换而不是管道:

代码语言:javascript
复制
exec /bin/bash -c {awk -F"[][]" '/dB/{print $2}' <(amixer sget Master)}

这两行都使用{...}语法从tcl解释中转义bash代码,从而允许在两者之间使用普通的bash代码。

我不确定这是否是最好的方法,因为它基本上将所有工作从tcl转移到bash,但至少这对我是有用的(使用tcl 8.5.13-r1、GNU bash 4.2.45(1)和GNU awk 4.0.1)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18651444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档