想从tcl执行awk吗

想从tcl执行awk吗,awk,tcl,Awk,Tcl,我想在tcl中执行以下行: exec awk-F“[]]”/dB/{print$2}Thx to Donal Felows我发现问题不在于shell引用,而在于tcl语法。因此,我修改了我的整个答案,提出以下建议: exec/bin/bash-c{amixer-sget-Master | awk-F“[]]”/dB/{print$2}} 或者,如果您希望使用流程替换而不是管道: exec/bin/bash-c{awk-F“[]]”/dB/{print$2}Thx给Donal Fellows我发

我想在tcl中执行以下行:


exec awk-F“[]]”/dB/{print$2}Thx to Donal Felows我发现问题不在于shell引用,而在于tcl语法。因此,我修改了我的整个答案,提出以下建议:

exec/bin/bash-c{amixer-sget-Master | awk-F“[]]”/dB/{print$2}}
或者,如果您希望使用流程替换而不是管道:


exec/bin/bash-c{awk-F“[]]”/dB/{print$2}Thx给Donal Fellows我发现问题出在不是shell引用而是tcl语法。因此我修改了我的整个答案,提出以下建议:

exec/bin/bash-c{amixer-sget-Master | awk-F“[]]”/dB/{print$2}}
或者,如果您希望使用流程替换而不是管道:


exec/bin/bash-c{awk-F“[]]”“/dB/{print$2}”shell和Tcl具有完全不同的语法,这是一个重要的方面。
shell调用的正确音译:

awk -F"[][]" '/dB/ { print $2 }' <(amixer sget Master)
在partixular中,Tcl和shell在如何引用内容以及需要引用哪些内容方面有不同的想法。此外,让
awk
只从stdin获取其输入,而不是试图让Tcl正确处理管道,以与shell完全相同的方式进行重定向要容易得多(你可以做到,但这是一项艰苦的工作,不值得为这么简单的事情费心)

当然,您可以改用Tcl进行解析,因为它具有合理的正则表达式匹配支持

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

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

awk -F"[][]" '/dB/ { print $2 }' <(amixer sget Master)
在partixular中,Tcl和shell在如何引用内容以及需要引用哪些内容方面有不同的想法。此外,让
awk
只从stdin获取其输入,而不是试图让Tcl正确处理管道,以与shell完全相同的方式进行重定向要容易得多(你可以做到,但这是一项艰苦的工作,不值得为这么简单的事情费心)

当然,您可以改用Tcl进行解析,因为它具有合理的正则表达式匹配支持

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


进程替换由shell完成。尝试调用bash,比如:
exec bash-c“awk…”我尝试过,但现在我遇到另一个错误:
无法读取“2”:没有这样的变量
\$2
转义美元,
amixer sget Master
的输出是什么?@Qben:它似乎与包含字符的字符列表相匹配
[
]
至少对我来说,
$2
返回了
76%
左前方:回放56[76%][-18.00dB][on]
$3
使用GNU
awk评估为
-18.00dB
。进程替换由shell完成。尝试调用bash,如:
exec bash-c“哎呀……我试过了,但现在我又遇到了另一个错误:
无法读取“2”:没有这样的变量
\$2
转义美元,
amixer sget Master
的输出是什么?@Qben:它似乎与包含字符的字符列表相匹配
[
]
…至少对我来说,
$2
返回了
76%
左前方:播放56[76%][-18.00dB][on]
$3
使用GNU
awk
3.1.8评估为
-18.00dB
。它给我这个错误:
无法读取文件”(amixer):没有这样的文件或目录
。您是否尝试用实际的SHELL(例如
/bin/sh
)替换
$SHELL
?你能给我一个MWE,让我在现实生活中测试我的代码吗?是的。我更改了$SHELL变量。我尝试了更新,tcl抱怨:
关闭引号后额外的字符。
。对不起,什么是WME?@milarepa:很抱歉没有先解释就使用了缩写。MWE是最小工作示例的缩写-我需要的一段代码可以复制/粘贴以测试您的实际问题。在本例中,一个简短的tcl脚本包含导致问题的行以及您如何调用它。在我开始出现问题后,我只在tclsh上测试该行,因此不涉及其他代码。它会给我以下错误:
无法读取文件”(amixer):没有这样的文件或目录
。您是否尝试用实际的SHELL(例如
/bin/sh
)替换
$SHELL
?你能给我一个MWE,让我在现实生活中测试我的代码吗?是的。我更改了$SHELL变量。我尝试了更新,tcl抱怨:
关闭引号后额外的字符。
。对不起,什么是WME?@milarepa:很抱歉没有先解释就使用了缩写。MWE是最小工作示例的缩写-我需要的一段代码可以复制/粘贴以测试您的实际问题。在本例中,一个简短的tcl脚本包含导致问题的行以及如何调用它。在我开始出现问题后,我只在tclsh上测试该行,因此不涉及其他代码。它最终可以工作!!!!
exec amixer sget Master|awk{-F[]}{/dB/{print$2}
谢谢@Donal FellowsIt终于成功了!!!!
exec amixer sget Master | awk{-F[][]}{/dB/{print$2}
谢谢@Donal Fellows