如何将字符串变量作为参数传递给 awk

如何将字符串变量作为参数传递给 awk

我有以下命令:

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 用来控制如何将输入分解为字段和记录的变量。如果需要对单个数据文件进行多次传递,它还可用于控制状态。

相关内容