我有以下命令:
usb_soundcard_sink=$(pactl list short sinks | grep "alsa_output" | awk '{ print $2 }' | tail -n1)
该命令的输出是:
alsa_output.pci-0000_00_1b.0.analog-stereo
这是另一个查找索引号的命令:
var=$(pactl list short sinks | awk '$2=="alsa_output.pci-0000_00_1b.0.analog-stereo" {print $1}')
输出:
0
但是我想在上述命令中传递“usb_soundcard_sink”变量,而不是硬编码值,即“alsa_output.pci-0000_00_1b.0.analog-stereo”。因为“usb_soundcard_sink”变量的值可能会动态变化。
我还尝试了以下操作:
var=$(pactl list short sinks | awk '$2=="$usb_soundcard_sink" {print $1}')
但它不起作用
那么我如何将“usb_soundcard_sink”变量的值传递给上述命令
答案1
要将内部传递到 awk 代码中,您必须使用-v
如下语法:
$ awk -v myvar="3" 'BEGIN{print myvar}'
# \__________/ \___/
3
在您的具体情况下,只需使用:
pactl list short sinks | awk -v myvar="$usb_soundcard_sink" '$2==myvar {print $1}'
# \___/ \___/
# |________________________________|
答案2
我发现这也有效
line=myfile.dat
f=8
s=11
echo $line | awk '{print $'$f',$'$s'}'
这里我有一个名为 myfile.dat 的文件通过管道传输到 awk,它会输出第 8 列和第 11 列。
答案3
MAWK(Ubuntu 的默认 AWK 版本)和 GAWK 都以变量赋值的形式读取非选项命令行参数identifier=value
,这些赋值在BEGIN
语句执行后立即执行:
% echo | mawk -- '{print var}' var=foo
foo
% echo | gawk -- '{print var}' var=foo
foo
% echo foo bar baz | mawk -- '{$1=$1}1' OFS=,
foo,bar,baz
% echo foo bar baz | gawk -- '{$1=$1}1' OFS=,
foo,bar,baz
我更喜欢这种方法,-v
因为它使命令更清晰,明确地分离要传递给解释器的选项和程序的细节。
从man mawk
:
命令行参数分为三组:文件参数、赋值参数和空字符串“”。赋值的形式为 var=string。当 ARGV[i] 被检查为可能的文件参数时,如果它为空,则跳过它;如果它是赋值参数,则对 var 进行赋值,并且 i 跳至下一个参数;否则 ARGV[i] 将打开以供输入。
从man gawk
:
如果命令行上的文件名采用 var=val 形式,则将被视为变量赋值。变量 var 将被赋值为 val。(这发生在运行任何 BEGIN 规则之后。)命令行变量赋值最适用于动态赋值给 AWK 用来控制如何将输入分解为字段和记录的变量。如果需要对单个数据文件进行多次传递,它还可用于控制状态。